Помогите починить советника

 
Этот советник не всегда выставляет тейк профит и стоп лосс, один человек сказал что нужно добавить пару пунктов спреда. А куда их добавит в этот советник?
Файлы:
24_1.mq4  7 kb
 

Чтобы быть уверенным что обе цены зашли за МА, советую писать if (Ask < ima) дл продаж и if (Bid > ima) для покупок, поможет избежать совершения сделок когда Бид и Аск по разные стороны от МА. Но это всё равно не гуд, открываться прямо на линии МА.

Строка OrderModify(OrderTicket(), OrderProfit(), SL, TP, 0); - угадайте что не так )))

Да и в конструкции ниже не вижу смысла в двойной модификации:

            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderProfit(), SL, TP, 0);
            SL = NormalizeDouble(Bid - StopLoss * Point, Digits);
            OrderModify(ticket, OrderProfit(), SL, TP, 0);      

Достаточно один раз модифицировать, последней строчкой.

Да, и для продаж всё же

            TP = NormalizeDouble(Bid - TakeProfit  * Point, Digits);//хотя тут тоже АСК можно, всё равно закрываться позиция по Аск будет...
            SL = NormalizeDouble(Ask + StopLoss * Point, Digits);  

А что насчёт добавки к МА, наверное имелось в виду добавить это условие:

      if (Bid > ima+NormalizeDouble(dev*Point,Digits)) - покупка
и
       if(Ask < ima-NormalizeDouble(dev*Point,Digits)) - продажа, 

где dev - отступ от МА в пунктах.

 
evillive:

Чтобы быть уверенным что обе цены зашли за МА, советую писать if (Ask < ima) дл продаж и if (Bid > ima) для покупок, поможет избежать совершения сделок когда Бид и Аск по разные стороны от МА. Но это всё равно не гуд, открываться прямо на линии МА.

Да и в конструкции ниже не вижу смысла в двойной модификации:

Достаточно один раз модифицировать, последней строчкой.

Да, и для продаж всё же

А что насчёт добавки к МА, наверное имелось в виду добавить это условие:

Есть ещё неучтённый StopLevel. А он ещё бывает нулю равен, и тогда высчитывается по-разному. В Альпари, например, он всегда нулевой, но ограничения есть, и они считаются как спред*2

Значит нужно сначала определиться с уровнем StopLevel:

Глобально:

int level=0, sp=0;

Затем в start() :

   sp=MarketInfo(sy,MODE_SPREAD);
//-------------- Проверка StopLevel ---------------
   level=MarketInfo(sy,MODE_STOPLEVEL );           // Значение уровня установки стопов
   if (level==0) level=sp*2;

А потом уже сравнивать размер стоп-приказа с полученным уровнем и использовать рассчитанные верные значения для стоп-приказов:

//+----------------------------------------------------------------------------+
   double pa=MarketInfo(Symbol(),MODE_ASK),  // цена Ask
          pb=MarketInfo(Symbol(),MODE_BID),  // цена Bid
          sl=0, tp=0;
   if(OrderType()==OP_BUY) {
      sl=NormalizeDouble(MathMin(pb-StopLoss*Point,pb-(level+1)*Point),Digits);
      tp=NormalizeDouble(MathMax(pb+TakeProfit*Point,pb+(level+1)*Point),Digits);
      // далее используем полученные уровни 
      // sl для цены StopLoss 
      // и tp для цены TakeProfit
      }
   if(OrderType()==OP_SELL) {
      sl=NormalizeDouble(MathMax(pa+StopLoss*Point,pa+(level+1)*Point),Digits());
      tp=NormalizeDouble(MathMin(pa-TakeProfit*Point,pa-(level+1)*Point),Digits());
      // далее используем полученные уровни 
      // sl для цены StopLoss 
      // и tp для цены TakeProfit
      }
//+----------------------------------------------------------------------------+
 
Да там если придираться по полной (как для запуска на реал), то пальцев не хватит все косяки перечислять )))
 
evillive:
Да там если придираться по полной (как для запуска на реал), то пальцев не хватит все косяки перечислять )))

Так я ж не придираюсь. Но такие-то расчёты просто обязаны быть, даже в советнике для тестера. Это ж азы. А то потом репу чешут: что, да от куда...

ЗЫ. А в приложенный код не глядел, чтобы плохо не стало

 
evillive:

Но это всё равно не гуд, открываться прямо на линии МА.


Какие-то технические проблемы или просто религия не позволяет?
 
Roger:

Какие-то технические проблемы или просто религия не позволяет?

Религия - зло, конечно не позоляет )))
Причина обращения: