Подскажите почему советник работает ни так?

 

Всем привет, подскажите почему советник работает ни так, я не специалист в этом деле, но попытался что-то реализовать, в основе четыре индикатора, но интересует Williams’ Percent Range (%R) или Процентный Диапазон Вильямса, таких два с разными периодами, позиция на покупку должна произойти когда значение индикаторов снизу вверх пройдут уровень -85 дальше уровень -75 здесь и открытие позиции при условии, что

//+------------------------------------------------------------------+
//|                                                     MACD1.mq4    |
//|                                                        Александр |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Александр"
#property link      ""

extern double Lots               = 0.4;
extern double TakeProfit         = 35;
extern double StopLoss           = 200;
extern double TrailingStop       = 15;
extern double TrailingStep       = 10;
extern double     RSIBuy         = 55;
extern double     RSISell        = 45; 
bool RuleBuy=false;
bool RuleSell=false;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |



void start()
{
int  total,i;
int ticket; 
double MacdCurrent=iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double SignalCurrent=iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
double TickRSI=iRSI(NULL,15,14,PRICE_CLOSE,0);
double TickWPR=iWPR( NULL,15,114,0);
double TickWPR2=iWPR( NULL,15,26,0);
total=OrdersTotal();
   if(total<1) 

if (TickRSI<40&&TickWPR<-85&&TickWPR2<-85) RuleBuy=true;
if ((TickRSI>50&&TickWPR>-75&&TickWPR2>-75)&&(RuleBuy==true)) 
if (MacdCurrent<0&&MacdCurrent>SignalCurrent&&TickWPR2<-35)
{
    ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point, 
                               Ask + TakeProfit*Point,"ОК",0,Blue);
            if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order  : ",OrderOpenPrice());
            RuleBuy=false;
           }             
      return; 
     }  
if (TickRSI>60&&TickWPR>-15&&TickWPR2>-15) RuleSell=true;  
if ((TickRSI<50&&TickWPR<-25&&TickWPR2<-25)&&(RuleSell==true))
if (MacdCurrent>0&&MacdCurrent<SignalCurrent&&TickWPR2>-60)  
{
   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point, 
                               Bid - TakeProfit*Point,"ОК",0,Red);
            if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие Sell order  : ",OrderOpenPrice());
            RuleSell=false;
           }        
 return; 
     }
//------------Закрытие позиций----------------------------------------
 
 for(i=0; i<total; i++) 
     {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
         
      if(TrailingStop>0)
      if (Bid-OrderOpenPrice() > TrailingStop*Point) 
      {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) 
        {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
   if (OrderType() == OP_SELL)
    {
     if (OrderOpenPrice()-Ask > TrailingStop*Point) 
     {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) 
        {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
 }
    }
     } 
    
   return(0);
  }
  return;
  }

один из индикаторов не привысил уровень >-35.

Вот здесь такое условие не выполняется, здесь рассогласование индикаторов но открывается позиция на продажу почему не могу разобраться:

 

Былобы не плохо если бы вы еще подписали где на рисунке какой индикатор, но если считать  период TickWPR > TickWPR2, то все верно условие на открытие селл выполняется, да и где у вас в условии для открытия селл вообще есть уровень -35?



 
expromt >>:

Былобы не плохо если бы вы еще подписали где на рисунке какой индикатор, но если считать период TickWPR > TickWPR2, то все верно условие на открытие селл выполняется, да и где у вас в условии для открытия селл вообще есть уровень -35?



Ну может не совсем ясно объяснил, тогда вот так:

1) Williams’ Percent Range с периодом 26; 2) Williams’ Percent Range с периодом 114;

TickWPR2>-60 ошибся должно быть TickWPR2>-65 в условии продажи, TickWPR2<-35 покупки

Рассогласование в первых двух индикаторах, где обозначено вертикальной линией, первый индикатор разрешает продавать, второй покупать, но открывается позиция на продажу, хотя этого не должно происходить, вот здесь мне и не понятно почему это произошло, что ни так в коде.

 
alexdolar писал(а) >>

Ну может не совсем ясно объяснил, тогда вот так:

1) Williams’ Percent Range с периодом 26; 2) Williams’ Percent Range с периодом 114;

TickWPR2>-60 ошибся должно быть TickWPR2>-65 в условии продажи, TickWPR2<-35 покупки

Рассогласование в первых двух индикаторах, где обозначено вертикальной линией, первый индикатор разрешает продавать, второй покупать, но открывается позиция на продажу, хотя этого не должно происходить, вот здесь мне и не понятно почему это произошло, что ни так в коде.

Попробуйте поместить следующие операторы в начало процедуры Start()

RuleBuy=false;

RuleSell=false;

 
Mislaid >>:

Попробуйте поместить следующие операторы в начало процедуры Start()

RuleBuy=false;

RuleSell=false;

Да попробовал, но позиций при перемещении операторов не открываются. Насколько я понимаю происходит так, например: индикатор 2 в какой то момент времени выполняет условия на открытие позиции Sell индикатор 1 не выполняет такого условия, через какой то промежуток времени индикатор 1 выполняет условие Sell и происходит открытие позиции но уже поздно. Вопрос как можно обнулить условие Sell индикатора 2 при пересечении уровня -80 сверху вниз, или дело не в том?

 
alexdolar >>:

Ну может не совсем ясно объяснил, тогда вот так:

1) Williams’ Percent Range с периодом 26; 2) Williams’ Percent Range с периодом 114;

TickWPR2>-60 ошибся должно быть TickWPR2>-65 в условии продажи, TickWPR2<-35 покупки

Рассогласование в первых двух индикаторах, где обозначено вертикальной линией, первый индикатор разрешает продавать, второй покупать, но открывается позиция на продажу, хотя этого не должно происходить, вот здесь мне и не понятно почему это произошло, что ни так в коде.


ИМХО - самая большая проблема Вашего советника - работа с ценой закрытия на НУЛЕВОМ баре. Как следствие - то, что отражается по истории не соответствует текущим расчетам в эксперте.

Поищите по форуму - это сотни раз обсуждалось.

Успехов.

 
VladislavVG >>:

ИМХО - самая большая проблема Вашего советника - работа с ценой закрытия на НУЛЕВОМ баре. Как следствие - то, что отражается по истории не соответствует текущим расчетам в эксперте.

Поищите по форуму - это сотни раз обсуждалось.

Успехов.

Работать с ценой закрытия на НУЛЕВОМ баре, я уже отказался и код выглядит так:


















void start()
{
int  total,i;
int ticket; 
double MacdCurrent=iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
double SignalCurrent=iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
double TickWPR=iWPR( NULL,15,114,2);
double TickWPR2=iWPR( NULL,15,26,2);
double TickiDeM=iDeMarker( NULL,15,13,1);
total=OrdersTotal();
   if(total<1) 

if (TickWPR<-85&&TickWPR2<-85) RuleBuy=true;
if ((TickWPR>-80&&TickWPR2>-80)&&(RuleBuy==true)) 
if (MacdCurrent<-0.00015&&TickiDeM<0.3&&TickWPR2<-20)
{
    ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point, 
                               Ask + TakeProfit*Point,"ОК",0,Blue);
            if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order  : ",OrderOpenPrice());
            RuleBuy=false;
           }             
      return; 
     }  
if (TickWPR>-15&&TickWPR2>-15) RuleSell=true;  
if ((TickWPR<-20&&TickWPR2<-20)&&(RuleSell==true))
if (MacdCurrent>0.00015&&TickiDeM>0.7&&TickWPR2>-80)  
{
   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point, 
                               Bid - TakeProfit*Point,"ОК",0,Red);
            if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие Sell order  : ",OrderOpenPrice());
            RuleSell=false;
           }        
 return; 
     }
 

Да и вопрос у меня остался открытым:

Насколько я понимаю происходит так, например: индикатор 2 в какой то момент времени выполняет условия на открытие позиции Sell индикатор 1 не выполняет такого условия, через какой то промежуток времени индикатор 1 выполняет условие Sell и происходит открытие позиции но уже поздно. Вопрос как можно обнулить условие Sell индикатора 2 при пересечении уровня -80 сверху вниз, или дело не в том?


И что такое ИМХО ели можно поесните?

Причина обращения: