Ваши вопросы по языку MQL4

RV_aka_rvn

Активный участник
Так отодвиньте дальше SL от цены при модификации - тем самым выясните что код рабочий. Перед тем как произвести модификацию ордера проверить на соответствие значения MODE_STOPLEVEL, величина значения может плавать.
ВСЁ! Поймал я её за за... Сейчас прогнал на тех ДЦ, всё чисто, проверил воскресные и сегодняшние прогоны и нашёл в чём собака порылась, на одном графике где выпадала 145 ошибка (а я только по журналу смотрел) были: Ошибки рассогласования графиков 4, сейчас 0, видно котировки подгрузились что ли... Теперь всё и везде по нулям! Видно заработался или старый стал... По деньгам кстати тоже разница, почти в 100 баков (ладно хоть демо). Совет всем- следите за котировками и чтобы ошибок всегда было 0, тогда будете уверены, что на реале такого не будет (как в тестере)... Спасибо mobidikу за советы
 

RV_aka_rvn

Активный участник
Стоплевел здесь совсем не при делах. Надо проверять SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL)
Тоже интересная мысль, по-умолчанию у меня он равен 3
Нашёл в чём дело, в кривых котировках, нельзя гонять совы и работать на одном терминале, для проверок надо ставить второй терминал с "правильными" котировками для тестов
 
Последнее редактирование:

RV_aka_rvn

Активный участник
Короче здесь ничего не при делах...И дело было не в бобине! :) У меня такая же фигня на другой паре вывалилась...
Сделал я такую интересную конструкцию, проверку не на Ask (так как это величина расчётная), а вот так:
(Bid+(MarketInfo(Symbol(),MODE_SPREAD*Point)
И... прокатило! Без ошибки 145 Только стоплосс остался висеть в первом случае на 65 пунктов, второй раз на 68 пунктов вместо 35 от цены (в сумме в 133 пункта-мой трал в 35+35 п.), сработали тейкпрофиты... Только и она не работает (это безубыток)
Прокатило, когда я шаг поставил 5, поставлю ка я дополнительно стоплевел, отпишусь, если что
 

Вложения

  • 1.png
    1.png
    105,3 КБ · Просмотры: 20
  • 2.png
    2.png
    113 КБ · Просмотры: 28
  • 3.png
    3.png
    115,5 КБ · Просмотры: 16
  • 4.png
    4.png
    113,3 КБ · Просмотры: 11
Последнее редактирование:

fs256

Местный знаток
Короче здесь ничего не при делах...И дело было не в бобине! :) У меня такая же фигня на другой паре вывалилась...
Сделал я такую интересную конструкцию, проверку не на Ask (так как это величина расчётная), а вот так:
(Bid+MarketInfo(Symbol(),MODE_SPREAD)
И... прокатило! Без ошибки 145 Только стоплосс остался висеть в первом случае на 65 пунктов, второй раз на 68 пунктов вместо 35 от цены (в сумме в 133 пункта-мой трал в 35+35 п.), сработали тейкпрофиты... Только и она не работает (это безубыток)
Прокатило, когда я шаг поставил 5, поставлю ка я дополнительно стоплевел, отпишусь, если что

Т.е. MarketInfo(_Symbol,MODE_ASK)
 

vladradon

Программист
Сделал я такую интересную конструкцию, проверку не на Ask (так как это величина расчётная), а вот так:
(Bid+(MarketInfo(Symbol(),MODE_SPREAD*Point)
И... прокатило! Без ошибки 145 Только стоплосс остался висеть в первом случае на 65 пунктов, второй раз на 68 пунктов вместо 35 от цены (в сумме в 133 пункта-мой трал в 35+35 п.), сработали тейкпрофиты... Только и она не работает (это безубыток)
Прокатило, когда я шаг поставил 5, поставлю ка я дополнительно стоплевел, отпишусь, если что
Привет! У меня в трале (попунктном) изначально идет проверка на стоплевел и нормализация нового стоплосса:
PHP:
void TrailingStop(int s_ticket,double trldist)
  {
   double newstop=0;
   double stoplevel=MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(trldist<=stoplevel) trldist=stoplevel+1;
   if(!OrderSelect(s_ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      Print("Трейлинг невозможен - не найден ордер тикет ",s_ticket);
      return;
     }
//-----------------------------------------------------------
   if(OrderType()==OP_BUY)
     {
      if((OrderStopLoss()==0.0) || (OrderStopLoss()<OrderOpenPrice()))
        {
         if(Bid>(OrderOpenPrice()+(trldist+TrlLevel)*_Point))
            newstop=NormalizeDouble(Bid-TrlLevel*_Point,_Digits);
        }
      else
         if(Bid>(OrderStopLoss()+TrlLevel*_Point))
            newstop=NormalizeDouble(Bid-TrlLevel*_Point,_Digits);
      if(newstop>OrderStopLoss() && (newstop<Bid-stoplevel*_Point))
         if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
     }
//-----------------------------------------------------------
   if(OrderType()==OP_SELL)
     {
      if((OrderStopLoss()<=0) || (OrderStopLoss()>OrderOpenPrice()))
        {
         if(Ask<(OrderOpenPrice()-(trldist+TrlLevel)*_Point))
            newstop=NormalizeDouble(Ask+trldist*_Point,_Digits);
        }
      else
         if(Ask<(OrderStopLoss()-TrlLevel*_Point))
            newstop=NormalizeDouble(Ask+TrlLevel*_Point,_Digits);
      if(newstop>0)
        {
         if(((OrderStopLoss()==0.0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+stoplevel*_Point))
           {
            if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
               Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
           }
         else
            if(OrderStopLoss()>newstop && (newstop>Ask+stoplevel*_Point))
               if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
                  Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
        }
     }
  }
Гонял его на разных брокерах с ненулевыми стопуровнями - ошибок не было. Шаг трала здесь от 1 пункта идет, а TrlLevel - уровень отката цены до срабатывания стоплосса. trldist - начальная дистанция срабатывания трала, которая должна быть не меньше стопуровень+1.
 
Последнее редактирование:

fs256

Местный знаток
Привет! У меня в трале (попунктном) изначально идет проверка на стоплевел и нормализация нового стоплосса:
PHP:
void TrailingStop(int s_ticket,double trldist)
  {
   double newstop=0;
   double stoplevel=MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(trldist<=stoplevel) trldist=stoplevel+1;
   if(!OrderSelect(s_ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      Print("Трейлинг невозможен - не найден ордер тикет ",s_ticket);
      return;
     }
//-----------------------------------------------------------
   if(OrderType()==OP_BUY)
     {
      if((OrderStopLoss()==0.0) || (OrderStopLoss()<OrderOpenPrice()))
        {
         if(Bid>(OrderOpenPrice()+(trldist+TrlLevel)*_Point))
            newstop=NormalizeDouble(Bid-TrlLevel*_Point,_Digits);
        }
      else
         if(Bid>(OrderStopLoss()+TrlLevel*_Point))
            newstop=NormalizeDouble(Bid-TrlLevel*_Point,_Digits);
      if(newstop>OrderStopLoss() && (newstop<Bid-stoplevel*_Point))
         if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
     }
//-----------------------------------------------------------
   if(OrderType()==OP_SELL)
     {
      if((OrderStopLoss()<=0) || (OrderStopLoss()>OrderOpenPrice()))
        {
         if(Ask<(OrderOpenPrice()-(trldist+TrlLevel)*_Point))
            newstop=NormalizeDouble(Ask+trldist*_Point,_Digits);
        }
      else
         if(Ask<(OrderStopLoss()-TrlLevel*_Point))
            newstop=NormalizeDouble(Ask+TrlLevel*_Point,_Digits);
      if(newstop>0)
        {
         if(((OrderStopLoss()==0.0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+stoplevel*_Point))
           {
            if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
               Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
           }
         else
            if(OrderStopLoss()>newstop && (newstop>Ask+stoplevel*_Point))
               if(!OrderModify(s_ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
                  Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
        }
     }
  }
Гонял его на разных брокерах с ненулевыми стопуровнями - ошибок не было. Шаг трала здесь от 1 пункта идет, а TrlLevel - уровень отката цены до срабатывания стоплосса. trldist - начальная дистанция срабатывания трала, которая должна быть не меньше стопуровень+1.

Может так:
trldist=fmin(trldist,MarketInfo(_Symbol,MODE_STOPLEVEL));
Вроде, на строку короче.

P.S. А зачем столько скобок, например - if(OrderStopLoss()==0 || OrderStopLoss()<OrderOpenPrice()) - чем отличается от вашего?
Я, если что, без наездов-только-проездом :D.
 

vladradon

Программист
Может так:
trldist=fmin(trldist,MarketInfo(_Symbol,MODE_STOPL EVEL));
Вроде, на строку короче.

P.S. А зачем столько скобок, например - if(OrderStopLoss()==0 || OrderStopLoss()<OrderOpenPrice()) - чем отличается от вашего?
Я, если что, без наездов-только-проездом .
Да, про скобки я забыл, видимо, когда последний раз редактировал - там раньше еще проверки были просто. :D А trldist должен быть при ненулевом стопуровне на минимум 1 больше. Равенство не прокатит. К тому же функция вернет меньшее из 2-х значений, а значит если trldist меньше стопуровня, то снова вернет его и ничего не изменится. Если trldist больше стопуровня, то менять ничего не нужно, а если меньше, то trldist=стопуровень +1 - по-любому в одну строчку не уложишься...;)
Ну или
PHP:
if(trldist<=MarketInfo(_Symbol,MODE_STOPLEVEL)) trldist=MarketInfo(_Symbol,MODE_STOPLEVEL)+1;
 
Последнее редактирование:

Violetta

Новичок форума
Уважаемые программисты, есть шаблон советника, открывает сделки по сигналу, закрывает по тп или стоплосу, или реверсу, каким образом можно заменить закрытие в случае профита не по тп а по сигналу? Хотя бы направление как решить. Спасибо
 

Вложения

  • robust_ea_template.mq4
    11,8 КБ · Просмотры: 22

RV_aka_rvn

Активный участник
Не ребята, всё проще, я всё-таки разобрался... Все тралы правильно работают... Обратите на строчки на втором рисунке внизу, тралилось всё хорошо, вдруг цена Ask вылетает 8-мизначная, так как в Modify она в расчёте участвует, из-за этого вылетает просто ошибка, это даже не 145, терминал такую цену не понимает, я специально вывел эту цену в формате NormalizeDouble(Ask,Digits)
функция NormalizeDouble её т.е. Ask почему-то не режет...

ЭТО ГЛЮК всё таки КОТИРОВОК!
 

Serg-Kamensk

Местный знаток
здравствуйте научите как в советник встроить трал
 

Вложения

  • Vili флет мартин.mq4
    35,6 КБ · Просмотры: 20

vladradon

Программист
Не ребята, всё проще, я всё-таки разобрался... Все тралы правильно работают... Обратите на строчки на втором рисунке внизу, тралилось всё хорошо, вдруг цена Ask вылетает 8-мизначная, так как в Modify она в расчёте участвует, из-за этого вылетает просто ошибка, это даже не 145, терминал такую цену не понимает, я специально вывел эту цену в формате NormalizeDouble(Ask,Digits)
функция NormalizeDouble её т.е. Ask почему-то не режет...
Тогда есть еще кривой путь обрезки, который режет однозначно:
PHP:
double ask=StrToDouble(DoubleToStr(Ask,_Digits));
 
Последнее редактирование:

fs256

Местный знаток
Да, про скобки я забыл, видимо, когда последний раз редактировал - там раньше еще проверки были просто. :D А trldist должен быть при ненулевом стопуровне на минимум 1 больше. Равенство не прокатит. К тому же функция вернет меньшее из 2-х значений, а значит если trldist меньше стопуровня, то снова вернет его и ничего не изменится. Если trldist больше стопуровня, то менять ничего не нужно, а если меньше, то trldist=стопуровень +1 - по-любому в одну строчку не уложишься...;)
Ну или
PHP:
if(trldist<=MarketInfo(_Symbol,MODE_STOPLEVEL)) trldist=MarketInfo(_Symbol,MODE_STOPLEVEL)+1;

Ух ё... Тогда из-за стола вышел, пардон; - там fmax естественно, а на счет "+1":
trldist=fmax(trldist,MarketInfo(_Symbol,MODE_STOPLEVEL)+1);
 

vladradon

Программист
Уважаемые программисты, есть шаблон советника, открывает сделки по сигналу, закрывает по тп или стоплосу, или реверсу, каким образом можно заменить закрытие в случае профита не по тп а по сигналу? Хотя бы направление как решить. Спасибо
Там в коде реверс и закрывает по противоположному сигналу, но нет возможности выставить нулевой ТП и еще проверка при инициализации идет на ненулевые значения ТП и СЛ во входных параметрах, которые нужно убрать (строки с 38 по 48 включительно). И заменить функцию на мной переделанную:
PHP:
void setTakeProfitAndStopLoss()
  {
   if(takeProfit>0) buyTakeProfitPips=NormalizeDouble(Ask+takeProfit*Point,Digits); else buyTakeProfitPips=0;
   if(stopLoss>0) buyStopLossPips=NormalizeDouble(Ask-stopLoss*Point,Digits); else buyStopLossPips=0;
   if(takeProfit>0) sellTakeProfitPips=NormalizeDouble(Bid-takeProfit*Point,Digits); else sellTakeProfitPips=0;
   if(stopLoss>0) sellStopLossPips=NormalizeDouble(Bid+stopLoss*Point,Digits); sellStopLossPips=0;
  }
 

vladradon

Программист
ну научите что вам сложно где открыть скобки
Для начала там мартин и для него нужен особый трал, который будет тралить сразу весь набор колен в рынке, присваивая один стоплосс всем коленам. Но еще один момент - трал должен начинаться после того, как колена в сумме выйдут в плюс и если тупо указать какую-то начальную дистанцию трала, то не факт, что при каком-то количестве колен эта дистанция будет в плюсе и ее не нужно будет увеличивать. Для этого нужно использовать расчет уровня безубытка и уже от него плясать, добавляя к нему уже дистанцию трала. Короче, не все так просто.
 

fs256

Местный знаток
Уважаемые программисты, есть шаблон советника, открывает сделки по сигналу, закрывает по тп или стоплосу, или реверсу, каким образом можно заменить закрытие в случае профита не по тп а по сигналу? Хотя бы направление как решить. Спасибо

Так и есть - по сигналу. Только откуда он берет OrderTicket (строчки - 120 и 134)? Голова не особо варит, может что упустил?

Код:
//+------------------------------------------------------------------+
void processSignalHasPositionOpen(const int signal)
  {
   switch(OrderType())
     {
      case OP_BUY:   // A buy order exists
         if(signal<0)
           {
            Print("Short Conditions Met");
// здесь
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Violet)) 

              {
               Print("Error closing buy order: ",GetLastError());
                 } else if(OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,sellStopLossPips,sellTakeProfitPips,"TRAIDE EA",magicNumber,0,Red)<0) {
               Print("Error opening sell order: ",GetLastError());
              }
              } else if(signal>0) {
            Print("Long Conditions Still Met");
           }
         break;
      case OP_SELL:  // A sell order exists
         if(signal>0)
           {
            Print("Long Conditions Met");
// и здесь
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Violet))
              {
               Print("Error closing sell order: ",GetLastError());
                 } else if(OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,buyStopLossPips,buyTakeProfitPips,"TRAIDE EA",magicNumber,0,Green)<0) {
               Print("Error opening buy order: ",GetLastError());
              }
              } else if(signal<0) {
            Print("Short Conditions Still Met");
           }
         break;
      default:
         Print("Error, unexpected OrderType: ",OrderType());
         break;
     }
  }
//+------------------------------------------------------------------+
 

vladradon

Программист
Так и есть - по сигналу. Только откуда он берет OrderTicket (строчки - 120 и 134)? Голова не особо варит, может что упустил?
Там в другой функции выборка идет:
PHP:
void processSignal(const int signal)
  {
   setTakeProfitAndStopLoss(); // Set Take Profit and Stop Loss

   if(isPositionOpen()) // Check for open position
     {
      processSignalHasPositionOpen(signal);
     }
   else // If no open position
     {
      processSignalNoPositionOpen(signal);
     }
  }
//+------------------------------------------------------------------+
//| Check for currently open position                                |
//+------------------------------------------------------------------+
bool isPositionOpen()
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==magicNumber && OrderSymbol()==Symbol())
        {
         return true;
        }
     }
   return false;
  }
 

fs256

Местный знаток
Там в другой функции выборка идет:
PHP:
void processSignal(const int signal)
  {
   setTakeProfitAndStopLoss(); // Set Take Profit and Stop Loss

   if(isPositionOpen()) // Check for open position
     {
      processSignalHasPositionOpen(signal);
     }
   else // If no open position
     {
      processSignalNoPositionOpen(signal);
     }
  }
//+------------------------------------------------------------------+
//| Check for currently open position                                |
//+------------------------------------------------------------------+
bool isPositionOpen()
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==magicNumber && OrderSymbol()==Symbol())
        {
         return true;
        }
     }
   return false;
  }


Верно, прежде чем советовать, - нужно разобраться (и не пить ничего крепче чая ;)). Второй раз (Ух ё) не прокатит, пойду спать. Спасибо за терпение.
 

_SERG_

Активный участник
Короче здесь ничего не при делах...И дело было не в бобине! :) У меня такая же фигня на другой паре вывалилась...
Сделал я такую интересную конструкцию, проверку не на Ask (так как это величина расчётная), а вот так:
(Bid+(MarketInfo(Symbol(),MODE_SPREAD*Point)
И... прокатило! Без ошибки 145 Только стоплосс остался висеть в первом случае на 65 пунктов, второй раз на 68 пунктов вместо 35 от цены (в сумме в 133 пункта-мой трал в 35+35 п.), сработали тейкпрофиты... Только и она не работает (это безубыток)
Прокатило, когда я шаг поставил 5, поставлю ка я дополнительно стоплевел, отпишусь, если что

Чет я не проникся мыслью по поводу расчётного ASK. :D Или такие выводи сделаны потому, что ASK на графике не отображается?
 

vladradon

Программист
Чет я не проникся мыслью по поводу расчётного ASK. Или такие выводи сделаны потому, что ASK на графике не отображается?
Привет! Не, такие глюки частенько бывают и по Bid тоже - выскакивает после запятой больше цифр, чем нужно. У меня даже на демо в онлайне такая фигня была и сов выдавал ошибки при работе с ордерами.
 
Верх