как дописать функцию

 

как в советник добавить функцию мартингейла? помогите прописать....советник ставит отложенные ордера по хай и лов с тайк профитом и стопом, нужно чтобы после убыточного ордера он увеличивал объем по мартингейлу(Х2),после выигрыша начинал с минимального лота.

Файлы:
 

Если последняя сделка убыточная - умножаем лот последней сделки на 2, если нет - ставим первоначальный.

закрылась ли последняя сделка по стопу:

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl || OrderProfit()<0) return(True);
  }
  return(False);
}

далее в проверке лотов ставим:

  if (isCloseLastPosByStop(Symbol(),-1,Magic))
Lot2=OrderLots()*Martin;
   if (!isCloseLastPosByStop(Symbol(),-1,Magic))Lot2=Первоначальный лот ;   if(Lot2 < MinLots) Lot2 = MinLots;   if(Lot2 > MaxLots) Lot2 = MaxLots;   return(NormalizeDouble(Lot2,2));
 

Поясните, пожалуйста, где в коде тот кусок, который говорит, что если на последнем баре лось, то ... последующий лот будет увеличен.

То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.

 
hoz:

Поясните, пожалуйста, где в коде тот кусок, который говорит, что если на последнем баре лось, то ... последующий лот будет увеличен.

То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.

В функции isCloseLastPosByStop() определяется закрылся ли последний по времени ордер по стопу.

А здесь, если последний ордер был закрыт по стопу лот увеличивается в Martin раз.

if (isCloseLastPosByStop(Symbol(),-1,Magic))
Lot2=OrderLots()*Martin;
Только Vladon почему то использовал здесь OrderLots(), что некорректно. Надо использовать вместо него функцию KimIV GetLotLastClosePos()
 

        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;

Я так понимаю op это и есть OrderType т.е. тип операции. Тогда возникает вопрос не по языку уже, а по логике. Зачем в коде условие:

op<0

Ведь типы операции бывают только от 0 до 5. Вот тут же написано https://docs.mql4.com/ru/constants/trading

Выходит по логике меньше нуля не может быть тип операции. p.s. Вот на данном примере хочу разобрать логику, которая уже меня измотала. Очень часто встречаю подобные моменты.

 
hoz:

https://forum.mql4.com/ru/11287/page21



- Базин, о чем ты мечтаешь?

- Куртку теплую купить мечтаю... Серьезно, прошлую зиму в осенней пробегал - болел всю дорогу...

- На. Носи и мечтай о чем-нибудь великом...

 
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.
 
hoz:
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.

Дело в том, что приведенная функция - универсальная. Смотрите ее аргументы. Трейдера может не интересовать тип ордера. В этом случае он пропускает указание параметра op. В итоге параметр получает значение -1, что приводит к вечной истинности условия:

if (op<0 || OrderType()==op)
 
Нашел хороший вариант работы советника DayHL_Orders. Ставлю открытие ордеров: "Only Long"  оптимизирую и Прибыльность на паре EUR/USD доходит до 50% в месяц. Но есть одна проблема: надоели выскакивающие в терминале алерты:  "Невозможно установить OP_SELLLIMIT, цена слишком близка или выше High" и  "Невозможно установить OP_BUYLIMIT, цена слишком близка или ниже Low", которые не могу отключить пока не удалю советник с графика. Помогите как их убрать и что дописать или удалить в коде советника. Буду очень благодарен.  Может есть какие то ещё задумки доработки этого советника.Работу готов оплатить.  Пишите в личку:  yvv4112@gmail.com
Файлы:
Причина обращения: