+1
есть масса стрелочных индикаторов. можете воспользоваться индикатором из стратегии Profitable Strategy. Выглядит так:



скачать здесь

индикатор номер 6
а чтобы править суперпрофит нужен исходник
avatar

AM2

  • 3 декабря 2014, 19:59
0
добавил:


//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern int    Delta  = 200;  // расстояние до ордера и стопы
extern int    Slip   = 30;   // проскальзывание ордера
extern int    Try    = 5;    // количество попыток выставить ордер
extern double Lots   = 0.1;  // объем позиции
extern double MaxLot = 5;    // максимальный объем позиции
extern int    MAGIC  = 333;  // магик
double lot;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s,err;
   double price;   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(b<1)
    {
     price=Ask+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lot(),fND(price),Slip,fND(price-Delta*Point),fND(price+Delta*Point),"",MAGIC,0,Blue);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order BUYSTOP");     
    }             
                    
   //--- sell 
   if(s<1)
    {
     price=Bid-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lot(),fND(price),Slip,fND(price+Delta*Point),fND(price-Delta*Point),"",MAGIC,0,Red);
      if(res<0)
        {
         Print("Ошибка: ",GetLastError());
         err++;
         Sleep(500);
         RefreshRates();
        }
      else
         Print("OK Order SELLSTOP");     
    }
   if (err>Try) return;  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {  
   if(OrdersHistoryTotal()==0)
    {
     lot=Lots;
    }             
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))      
     {                                       
      if(OrderProfit()>0)                     
       {
        lot=Lots;  
       }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*2;  
        }
     }
    if(lot>MaxLot)lot=MaxLot;            
   return(lot);
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   if(NewBar()==true)
    {    
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
    }    
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 1 декабря 2014, 22:48
0
можно так:


//+------------------------------------------------------------------+
//|                                                        False.mq4 | 
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC  20141115

extern int    StopLoss     = 200;
extern int    TakeProfit   = 800;
extern int    BULevel      = 300;    
extern int    Diapazon     = 200;
extern int    Delta        = 800;
extern int    ExtDepth     = 10;
extern int    ExtDeviation = 5;
extern int    ExtBackstep  = 3;
extern double Lots         = 0.1;

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double zz0,zz1,zz2,zz3,zz4,zz5;
   int    res,b,s;
   
//---- get Extremum ZigZag Price
 
   zz0=GetExtremumZZPrice(NULL,0,0,ExtDepth,ExtDeviation,ExtBackstep);
   zz1=GetExtremumZZPrice(NULL,0,1,ExtDepth,ExtDeviation,ExtBackstep);
   zz2=GetExtremumZZPrice(NULL,0,2,ExtDepth,ExtDeviation,ExtBackstep);
   zz3=GetExtremumZZPrice(NULL,0,3,ExtDepth,ExtDeviation,ExtBackstep);
   zz4=GetExtremumZZPrice(NULL,0,4,ExtDepth,ExtDeviation,ExtBackstep);
   zz5=GetExtremumZZPrice(NULL,0,5,ExtDepth,ExtDeviation,ExtBackstep);

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {
          if(OrderType()==OP_BUY) b++;
          if(OrderType()==OP_SELL) s++;
         }
       }  
     }             
           
   Comment("\n","ZZ0 = ",zz0,"\n",
          "ZZ1 = ",zz1,"\n",
          "ZZ2 = ",zz2,"\n",
          "ZZ3 = ",zz3,"\n",
          "ZZ4 = ",zz4,"\n");
   
//---- buy conditions
   if((zz4-zz2)<=Diapazon*Point && (zz2-zz0)>=Delta*Point && (Ask-zz0)>=Delta*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,fND(Ask-StopLoss*Point),fND(Ask+TakeProfit*Point),"",MAGIC,0,Blue);
      if(res<0)
       {
        Print("Order Buy  error: ",GetLastError());
       }
      else
        Print("OK Order Buy");  
      return;
     }   
//---- sell conditions
   if((zz4-zz2)<=Diapazon*Point && (zz0-zz2)>=Delta*Point && (zz0-Bid)>=Delta*Point)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,fND(Bid+StopLoss*Point),fND(Bid-TakeProfit*Point),"",MAGIC,0,Red);
      if(res<0)
       {
        Print("Order Sell  error: ",GetLastError());
       }
      else
        Print("OK Order Sell");  
      return;
     }
//----
  }
//+------------------------------------------------------------------+
double fND(double d, int n=-1) 
  {  
   if (n<0) return(NormalizeDouble(d, Digits)); 
   return(NormalizeDouble(d, n)); 
  }  
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
    {
     lastbar=curbar;
     return (true);
    }
   else
    {
     return(false);
    }
  }  
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++)
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY)
          {
           if(OrderOpenPrice()<=(Bid-BULevel*Point)&&OrderOpenPrice()>OrderStopLoss())
            {      
             bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
          }
            
         if(OrderType() == OP_SELL)
          {
           if(OrderOpenPrice()>=(Ask+BULevel*Point)&&OrderOpenPrice()<OrderStopLoss())
            {
             mod=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
            }
          }
        }
      }
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//--- go trading only for first tiks of new bar
   if(NewBar()==true)
    {
     if(OrdersTotal()<1) CheckForOpen();
    }
   if (BULevel!=0) BU();                                
//----
  }  
//+------------------------------------------------------------------+
avatar

AM2

  • 1 декабря 2014, 21:08
0
в коде нет проверки на магик. замените код:

//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
     if (OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
     if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);                
    }    
  }
//+------------------------------------------------------------------+



на


//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {    
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
          if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
          if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
          if (OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
          if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         }
       }                
    }    
  }
//+------------------------------------------------------------------+
avatar

AM2

  • 1 декабря 2014, 21:02
0
Советник по прежнему выставляет ордера в понедельник в определенный час на расстоянии от цены. В зависимости от положения цены над машкой ставим байстоп или селлстоп. Не сработавший ордер удаляется через указанное количество часов. Выход по стопу, трейлинг стопу и закрытию позы в пятницу.




//+------------------------------------------------------------------+
//|                                                         Weak.mq4 |
//|                                              Copyright 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#define MAGIC  20141106

extern int    StopLoss       = 600;    // Стоплосс ордера
extern int    Trailing       = 300;    // Трейлингcтоп ордера
extern int    Delta          = 300;    // Расстояние от цены  
extern int    StartHour      = 17;     // Час установки ордеров 
extern int    EndHour        = 23;     // Час закрытия ордеров
extern int    Expiration     = 8;      // Время истечения ордера
extern int    MovingPeriod   = 12;     // Период средней

extern bool   AllPositions   = False;  // Управлять всеми позициями
extern bool   ProfitTrailing = True;   // Тралить только профит
extern int    TrailingStop   = 400;    // Фиксированный размер трала
extern int    TrailingStep   = 150;    // Шаг трала

extern double Lots           = 0.1;    // Объем позиции
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int res;
   double ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,1);
   datetime expiration = TimeCurrent()+3600*Expiration;
   
   if(DayOfWeek()==1 && OrdersTotal()<1 && Hour()==StartHour && Ask>ma)
    { 
     double BuyStopPrice = fND(Ask+Delta*Point); 
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyStopPrice,0,fND(BuyStopPrice-StopLoss*Point),0,"",MAGIC,expiration,Blue);             
    }
    
   if(DayOfWeek()==1 && OrdersTotal()<1 && Hour()==StartHour && Bid<ma)
    { 
     double SellStopPrice = fND(Bid-Delta*Point);
     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,SellStopPrice,0,fND(SellStopPrice+StopLoss*Point),0,"",MAGIC,expiration,Red);         
    }
        
   if(OrdersTotal()>0) 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUY ||OrderType()==OP_SELL)  DeleteOrders();    
    }  
    
   if(Trailing>0) Trail();  
   if(DayOfWeek()==5 && OrdersTotal()>0 && Hour()==EndHour)ClosePos();
   Comment("\nDay Of Week: ",DayOfWeek());             
  }
//+------------------------------------------------------------------+
double fND(double d, int n=-1) 
  {  
   if (n<0) return(NormalizeDouble(d, Digits)); 
   return(NormalizeDouble(d, n)); 
  }
//+------------------------------------------------------------------+
void DeleteOrders() 
{ 
 bool del; 
 for (int i=OrdersTotal()-1; i>=0; i--) 
  {
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
   if (OrderType()==OP_BUYSTOP  ) del=OrderDelete(OrderTicket()); 
   if (OrderType()==OP_SELLSTOP ) del=OrderDelete(OrderTicket());   
  }  
}
//+------------------------------------------------------------------+
void ClosePos() 
{ 
 bool del; 
 for (int i=OrdersTotal()-1; i>=0; i--) 
  {
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
   if (OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White); 
   if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Ask,3,White);    
  }  
}
//+------------------------------------------------------------------+
void Trail()
{
 for (int i=0; i<OrdersTotal(); i++)
  {
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     if (OrderSymbol()==Symbol()||OrderMagicNumber()==MAGIC)
       if(OrderType()==OP_BUY)
         {
           if(Trailing>0)  
            {                
              if(Bid-OrderOpenPrice()>Point*Trailing)
               {
                 if(OrderStopLoss()<Bid-Point*Trailing)
                  {
                     bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing,OrderTakeProfit(),0,Yellow);
                  }
               }
            }
         }
        
        if(OrderType()==OP_SELL)
         {
           if(Trailing>0)  
            {                
              if((OrderOpenPrice()-Ask)>(Point*Trailing))
               {
                 if((OrderStopLoss()>(Ask+Point*Trailing)) || (OrderStopLoss()==0))
                  {
                   bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*Trailing,OrderTakeProfit(),0,Yellow);
                  }
               }
            }
         }  
   }
}
//+------------------------------------------------------------------+
avatar

AM2

  • 1 декабря 2014, 20:00
0
Следующая просьба к Андрею по этому советнику — необходимо во первых прикрутить трал и включить проверку на нахождении цены открытия выше\ниже простой машки с периодом 10 — своеобразный фильтр — если цена выше открываются только покупки, если ниже соответственно только продажи. Лучше конечно если параметр машки можно будет оптимизировать — ну и (+) или (-) к её значению энное количество пунктов. Спасибо тебе за работу многим она очень помогает освоить ремесло трейдинга я больше чем уверен!!!
P.S да чуть не забыл надо бы ордера закрывать ежедневно по закрытию дня и чтобы можно было отключать этот параметр т, е держать ордера дольше до закрытия недели.


ваш заказ в работе :) 
avatar

AM2

  • 1 декабря 2014, 18:39
0
в настройках нолик нужно убирать
avatar

AM2

  • 1 декабря 2014, 17:00
0
обновил советник в базе. бу сделаю. посмотрите как работает сначала. возможно входы еще доработать нужно будет, а потом уже все остальное.
avatar

AM2

  • 30 ноября 2014, 20:01
0
код можно скопировать отсюда из сообщения. если нужно, обновлю в базе
avatar

AM2

  • 30 ноября 2014, 17:26
0
добавил параметр истечения ордера. если ордера не сработали они удаляются через Expiration часов.


//+------------------------------------------------------------------+
//|                                                        Lorik.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern double TakeProfit = 23.6; // тейк профит ордера(23.6 по фибе или 0.0)
extern int EndHour       = 11;   // час окончания торговой сессии
extern int CountHour     = 8;    // длительность торговой сессии
extern int Expiration    = 14;   // время истечения ордера
extern int Delta         = 100;  // расстояние от вершин
extern double Lots       = 0.1;  // объем позиции
extern int MAGIC         = 333;  // магик
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s;
   datetime expiration = TimeCurrent()+3600*Expiration;
   double up=iHigh(Symbol(),0,iHighest(NULL,0,MODE_HIGH,CountHour,1));
   double dn=iLow(Symbol(),0,iLowest(NULL,0,MODE_LOW,CountHour,1));
   double delta=up-dn;
   double price,tp;
   Comment("\nHigh Price ",up,"\nLow Price  ",dn,"\nChannel Width  ",delta);
      
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
    
   //--- buy
   if(Hour()==EndHour && Ask<up)
    {
     if(TakeProfit==23.6) 
      {
       tp=up+delta/2;
      }
     else tp=up+delta;    
     price=up+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,dn,tp,"",MAGIC,expiration,Blue);
    }             
                    
   //--- sell 
   if(Hour()==EndHour && Bid>dn)
    {
     if(TakeProfit==23.6) 
      {
       tp=dn-delta/2;
      }
     else tp=dn-delta;
     price=dn-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,up,tp,"",MAGIC,expiration,Red);
    }  
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+

int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   if(NewBar()==true)
    {    
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
    }
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 30 ноября 2014, 15:33
0
Сейчас советник торгует так как указано на картинке




//+------------------------------------------------------------------+
//|                                                        False.mq4 | 
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"

#define MAGIC  20141115

extern int    StopLoss     = 200;
extern int    TakeProfit   = 800;
extern int    Diapazon     = 200;
extern int    Delta        = 800;
extern int    ExtDepth     = 10;
extern int    ExtDeviation = 5;
extern int    ExtBackstep  = 3;
extern double Lots         = 0.1;

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double zz0,zz1,zz2,zz3,zz4,zz5;
   int    res,b,s;
   
//---- get Extremum ZigZag Price
 
   zz0=GetExtremumZZPrice(NULL,0,0,ExtDepth,ExtDeviation,ExtBackstep);
   zz1=GetExtremumZZPrice(NULL,0,1,ExtDepth,ExtDeviation,ExtBackstep);
   zz2=GetExtremumZZPrice(NULL,0,2,ExtDepth,ExtDeviation,ExtBackstep);
   zz3=GetExtremumZZPrice(NULL,0,3,ExtDepth,ExtDeviation,ExtBackstep);
   zz4=GetExtremumZZPrice(NULL,0,4,ExtDepth,ExtDeviation,ExtBackstep);
   zz5=GetExtremumZZPrice(NULL,0,5,ExtDepth,ExtDeviation,ExtBackstep);

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {
          if(OrderType()==OP_BUY) b++;
          if(OrderType()==OP_SELL) s++;
         }
       }  
     }             
           
   Comment("\n","ZZ0 = ",zz0,"\n",
          "ZZ1 = ",zz1,"\n",
          "ZZ2 = ",zz2,"\n",
          "ZZ3 = ",zz3,"\n",
          "ZZ4 = ",zz4,"\n");
   
//---- buy conditions
   if((zz4-zz2)<=Diapazon*Point && (zz2-zz0)>=Delta*Point && (Ask-zz0)>=Delta*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,fND(Ask-StopLoss*Point),fND(Ask+TakeProfit*Point),"",MAGIC,0,Blue);
      if(res<0)
       {
        Print("Order Buy  error: ",GetLastError());
       }
      else
        Print("OK Order Buy");  
      return;
     }   
//---- sell conditions
   if((zz4-zz2)<=Diapazon*Point && (zz0-zz2)>=Delta*Point && (zz0-Bid)>=Delta*Point)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,fND(Bid+StopLoss*Point),fND(Bid-TakeProfit*Point),"",MAGIC,0,Red);
      if(res<0)
       {
        Print("Order Sell  error: ",GetLastError());
       }
      else
        Print("OK Order Sell");  
      return;
     }
//----
  }
//+------------------------------------------------------------------+
double fND(double d, int n=-1) 
  {  
   if (n<0) return(NormalizeDouble(d, Digits)); 
   return(NormalizeDouble(d, n)); 
  }  
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
    {
     lastbar=curbar;
     return (true);
    }
   else
    {
     return(false);
    }
  }  
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//--- go trading only for first tiks of new bar
   if(NewBar()==true)
    {
     if(OrdersTotal()<1) CheckForOpen();
    }                               
//----
  }  
//+------------------------------------------------------------------+
avatar

AM2

  • 30 ноября 2014, 13:48
0
хорошавин :)  сделаю и такой вариант
avatar

AM2

  • 29 ноября 2014, 23:27
0
Вот советник выставляет ордера точно по ТЗ. Стоп ставит на границе канала, тейк на уровне 23.6 или 0.0 по фибе. тейк вычисляется программно, вручную вводим необходимый уровень 23.6 или 0.0

такая торговля на нынешнем рынке имеет место быть. см. картинку




//+------------------------------------------------------------------+
//|                                                        Lorik.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Forex expert advisor"

//--- Inputs
extern double TakeProfit = 23.6; // тейк профит ордера(23.6 по фибе или 0.0)
extern int EndHour       = 11;   // час окончания торговой сессии
extern int CountHour     = 8;    // длительность торговой сессии
extern int Delta         = 100;  // расстояние от вершин
extern double Lots       = 0.1;  // объем позиции

//----
extern int MAGIC        = 333; // магик
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder()
  {
   int    res,b,s;
//--- get Moving Average 
   double up=iHigh(Symbol(),0,iHighest(NULL,0,MODE_HIGH,CountHour,1));
   double dn=iLow(Symbol(),0,iLowest(NULL,0,MODE_LOW,CountHour,1));
   double delta=up-dn;
   double price,tp;
   Comment("\nHigh Price ",up,"\nLow Price  ",dn,"\nChannel Width  ",delta);
      
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }            
   //--- sell 
   if(Hour()==EndHour && Bid>dn && s<1)
    {
     if(TakeProfit==23.6) 
      {
       tp=dn-delta/2;
      }
     else tp=dn-delta;
     price=dn-Delta*Point;
     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,up,tp,"",MAGIC,0,Red);
     return;
    }    
   //--- buy
   if(Hour()==EndHour && Ask<up && b<1)
    {
     if(TakeProfit==23.6) 
      {
       tp=up+delta/2;
      }
     else tp=up+delta;    
     price=up+Delta*Point;
     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,dn,up+delta,"",MAGIC,0,Blue);
     return;
    }             
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+

int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   if(NewBar()==true)
    {    
     if(CountTrades()<1)PutOrder();
     if(CountTrades()>0)DelOrder();
    }
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 29 ноября 2014, 23:22
0
поставлю на демо посмотрю в чем дело.
avatar

AM2

  • 29 ноября 2014, 21:17
0
все понятно, кроме двух разных тейк профитов. будем выставлять 2 ордера или один на выбор тейк идет?
avatar

AM2

  • 29 ноября 2014, 21:02
+1
что то я сомневаюсь чтобы работало так идеально. надо будет закодить на досуге
avatar

AM2

  • 29 ноября 2014, 20:35
0
Укажите пожалуйста на скрине условия входа на покупку и продажу по отдельности вместе с остальными параметрами как можно подробнее. Можно вот так примерно:

avatar

AM2

  • 29 ноября 2014, 17:22
0
скажем на Н1 считаем назад начиная с последнего 8 штук :) 
avatar

AM2

  • 29 ноября 2014, 17:11
0
В советнике сейчас вызов нескольких индикаторов и условия входа и выхода по индикаторам 2 и 4.



Предварительная версия в базе: www.opentraders.ru/downloads/520/
avatar

AM2

  • 29 ноября 2014, 17:07