Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 911

 
У тебя стоплосс и тейкпрофит в абсолютных величинах, а надо в относительных, типа Bid - Sl*Point.
 
abeiks:

Здравствуйте!

Мне в эксперте на открытие свечи проверяется предыдущая свеча, если условия позволяет то открывается позиция, если нет то не открывается. Проблема в том что позиция открывается раньше чем проверяется условие предыдущее свече. Получается в журнале вижу открытие позиции а потом что позиция не должна открывается. Как решит эту проблему?

Спасибо, сам разобрался. Поставил функцию проверку предыдущей свечи выше функций открытие позиции.
 
Извиняюсь за корявость
 
  if(S1a == S1b && S1a<20.0000 && S1b<20.0000 )
 {OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), Slippage, Bid - SL * Point, Ask + TP * Point, NULL, 0, 0,clrBlue);
     MyOrderStateB = 1;  
      if(!OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), 3, SL, TP, NULL, 0, 0,clrBlue)) 
   Print("Opening Buy error #", GetLastError());}
   else Sleep(2);
   

      
   if(S1a == S1b && S1a>80.0000 && S1b>80.0000 )

    {OrderSend(Symbol(), OP_SELL, OrderValue, NormalizeDouble(Bid, Digits), Slippage, Ask + SL * Point, Bid - TP * Point , NULL, 0, 0,clrRed);
      MyOrderStateS = 1; }    

       else Sleep(2);

 

И при относительных выдает тоже самое( 

 
Viktorline14:

 if(S1a == S1b && S1a<20.0000 && S1b<20.0000 )

 {OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), Slippage, SL, TP, NULL, 0, 0,clrBlue);

     MyOrderStateB = 1; 

      if(!OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), 3, SL, TP, NULL, 0, 0,clrBlue)) 

   Print("Opening Buy error #", GetLastError());}

   else Sleep(2);

Спасибо. Однако правильно или нет ? предупреждение все равно выдает

 

Неправильно, не надо два раза OrderSend вызывать. Да и СЛ с ТП надо считать относительно цены, а не в пунктах выставлять. И нормализовывать надо не цены открытия Аск и Бид, а результат расчётов СЛ и ТП.

В общем, "учиться, учиться и ещё раз учиться" )))

 
evillive:

Неправильно, не надо два раза OrderSend вызывать. Да и СЛ с ТП надо считать относительно цены, а не в пунктах выставлять. И нормализовывать надо не цены открытия Аск и Бид, а результат расчётов СЛ и ТП.

В общем, "учиться, учиться и ещё раз учиться" )))

Спасибо большое))) Вы мне очень помогли, теперь все работает:3
 

Еще раз большое спасибо!

Теперь есть одна проблема советник открывает несколько ордеров подряд, а не один как я хотел(

int start()



  { S1a = NormalizeDouble(iStochastic(NULL, 0, S1_period, 3, S1_slowing, MODE_SMA, 1, MODE_MAIN, 1), 0);

   S1b = NormalizeDouble(iStochastic(NULL, 0, S1_period, 3, S1_slowing, MODE_SMA, 1, MODE_SIGNAL, 1), 0);

   

   if(MyOrderStateB == 1)Sleep(300000);

    else MyOrderStateB = 0;

   if(MyOrderStateS == 1)Sleep(300000);

    else MyOrderStateS = 0;

    

 

     

   if(S1a == S1b && S1a<20.0000 && S1b<20.0000 )

 

      if(!OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), Slippage, Bid - SL * Point, Ask + TP * Point, NULL, 0, 0,clrBlue))

   Print("Opening Buy error #", GetLastError());  

     else Sleep(2);

   MyOrderStateB = 1;

  

   


      

   if(S1a == S1b && S1a>80.0000 && S1b>80.0000 )


    

    

       if(!OrderSend(Symbol(), OP_SELL, OrderValue, NormalizeDouble(Bid, Digits), Slippage, Ask + SL * Point, Bid - TP * Point , NULL, 0, 0,clrRed))

       Print("Opening Sell error #", GetLastError()); 

       else Sleep(2);

       MyOrderStateS = 1;

       

      

       

       

       

   return(0);}

 

Пронаблюдал странное поведение тестера стратегий. У меня советник устанавливает и тралит отложенные стоповые ордера. ошибка. Происходит следующее. Советник устанавилвает Байстоп и селлстоп на расстоянии 30 пунктов от текущей цены (Инструмент - GbpUsd. Четырёхзнак. Минимально-допустимый уровень = 3 пункта). Через какое-то время он их подтягивает вслед за рынком, если они не сработали. Так вот, что я вижу. модификация успешна, модификация успешна, а затем в какой-то момент времени хлоп и высскакивает ошибка №1. То есть всё было нормально, советник делал одни и те же действия и вдруг выскакивает эта ошибка. Цены все нормализованы до дигитса. Вообще, все величины, которые подаются на вход функции OrderModify() - всё нормализовано!

В чём может быть причина такого поведения советника в тестере? 

 
drknn:

Пронаблюдал странное поведение тестера стратегий. У меня советник устанавливает и тралит отложенные стоповые ордера. ошибка. Происходит следующее. Советник устанавилвает Байстоп и селлстоп на расстоянии 30 пунктов от текущей цены (Инструмент - GbpUsd. Четырёхзнак. Минимально-допустимый уровень = 3 пункта). Через какое-то время он их подтягивает вслед за рынком, если они не сработали. Так вот, что я вижу. модификация успешна, модификация успешна, а затем в какой-то момент времени хлоп и высскакивает ошибка №1. То есть всё было нормально, советник делал одни и те же действия и вдруг выскакивает эта ошибка. Цены все нормализованы до дигитса. Вообще, все величины, которые подаются на вход функции OrderModify() - всё нормализовано!

В чём может быть причина такого поведения советника в тестере? 

Нормализовать надо для проверки необходимости модификации. А лучше сравнивать модифицированную разницу цен с нулём.

if(NormalizeDouble(цена1 - цена2, _Digits) != 0)


В зависимости от условия может быть лучше поставить < или > нуля.

 
Viktorline14:

Еще раз большое спасибо!

Теперь есть одна проблема советник открывает несколько ордеров подряд, а не один как я хотел(

int start()



  { S1a = NormalizeDouble(iStochastic(NULL, 0, S1_period, 3, S1_slowing, MODE_SMA, 1, MODE_MAIN, 1), 0);

   S1b = NormalizeDouble(iStochastic(NULL, 0, S1_period, 3, S1_slowing, MODE_SMA, 1, MODE_SIGNAL, 1), 0);

   

   if(MyOrderStateB == 1)Sleep(300000);

    else MyOrderStateB = 0;

   if(MyOrderStateS == 1)Sleep(300000);

    else MyOrderStateS = 0;

    

 

     

   if(S1a == S1b && S1a<20.0000 && S1b<20.0000 )

 

      if(!OrderSend(Symbol(), OP_BUY, OrderValue, NormalizeDouble(Ask, Digits), Slippage, Bid - SL * Point, Ask + TP * Point, NULL, 0, 0,clrBlue))

   Print("Opening Buy error #", GetLastError());  

     else Sleep(2);

   MyOrderStateB = 1;

  

   


      

   if(S1a == S1b && S1a>80.0000 && S1b>80.0000 )


    

    

       if(!OrderSend(Symbol(), OP_SELL, OrderValue, NormalizeDouble(Bid, Digits), Slippage, Ask + SL * Point, Bid - TP * Point , NULL, 0, 0,clrRed))

       Print("Opening Sell error #", GetLastError()); 

       else Sleep(2);

       MyOrderStateS = 1;

       

      

       

       

       

   return(0);}


Как-то так.

  int start()

     {
      S1a=NormalizeDouble(iStochastic(NULL,0,S1_period,3,S1_slowing,MODE_SMA,1,MODE_MAIN,1),0);
      S1b=NormalizeDouble(iStochastic(NULL,0,S1_period,3,S1_slowing,MODE_SMA,1,MODE_SIGNAL,1),0);

      if(S1a==S1b && S1a<20.0000 && S1b<20.0000 && MyOrderStateB==0)
         (
        if(!OrderSend(Symbol(),OP_BUY,OrderValue,NormalizeDouble(Ask,Digits),Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,clrBlue))
            Print("Opening Buy error #",GetLastError());
          else
            MyOrderStateB=1;
         )

      if(S1a==S1b && S1a>80.0000 && S1b>80.0000 && MyOrderStateS==0)
        {
       if(!OrderSend(Symbol(),OP_SELL,OrderValue,NormalizeDouble(Bid,Digits),Slippage,Ask+SL*Point,Bid-TP*Point,NULL,0,0,clrRed))
            Print("Opening Sell error #",GetLastError());
         else
            MyOrderStateS=1;
        }



      return(0);
     }