Изучаем и пишем вместе на MQL5 - страница 24

 

Что эта функция делает ясно всем?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

  {

   MqlTradeRequest my_trade;

   MqlTradeResult my_trade_result;

   my_trade.action=TRADE_ACTION_DEAL;

   my_trade.symbol=Symbol();

   my_trade.volume=NormalizeDouble(volume,1);

   my_trade.price=NormalizeDouble(Bid,_Digits);

   my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);

   my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);

   my_trade.deviation=slippage;

   my_trade.type=ORDER_TYPE_SELL;

   my_trade.type_filling=ORDER_FILLING_AON;

   my_trade.comment=comment;

   my_trade.magic=magic;


   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))

     {

      time_oc=TimeLocal();

      md=0;

      Print("Код результата операции - ",my_trade_result.retcode);

     }

   else

     {

      Print("Код результата операции - ",my_trade_result.retcode);

      Print("Ошибка открытия ордера = ",GetLastError());

      }

return(0);

В процедуре OnTick()

...

OpenSell(Lots,10,"EUR/USD (Sell)",102406);

... 

  в самом начале:

double  StopLoss=250,         

           TakeProfit=1400;      

extern double Lots = 0.1;   

Каким хреном -220$  в результатах теста?

 <DATE> <BALANCE> <EQUITY> <MARGIN LEVEL>

01,01,2010  0:00:00 10000 10000 0

11,01,2010  2:57:00 9779,29 9841,92 6827

15,01,2010  16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010  2:14:00 10048,6 10048,6 0

26,01,2010  4:06:00 10048,6 10038,4 7099

27,01,2010  21:12:00 10188,5 10188,5 0

29,01,2010  2:16:00 10188,5 10308 7346

29,01,2010  7:14:00 10188,5 10277,4 7324

04,02,2010  22:05:00 10418,63 10480,83 7592

 

Если я ошибся, то ткните меня носом. 

 

Этот советник я Вам так не дам весь посмотреть. Функция на Бай аналогичная... 

Закрываю позицию встречным ордером. 

 

Ладно. Раскричался я тут. Только изучаю язык. Если кого-то обидел - извиняюсь. Буду работать и искать проблему. Скорее всего я сам виноват, но очень хочется научиться делать качественных советников на mql5. Очень хорошая система, но ... пока проблемы у меня.  

 

Хотя на mql4 пашут 20 советников без проблем. 

 
Khomtchenko:
...
Лучше приведите историю сделок за указанный период, а не эти, неведомо откуда взятые цифры. Тогда, возможно, станет ясно, откуда взялся этот убыток.
 

Приступил помаленьку к изучению раздела "Файловые операции". Подскажите, есть ли обучающие статьи на тему работы с файлами в MQL5?

 

Как правильно удалить все ордера с определенным мэджиком?

У меня для этого исп. две функции, check_orders проверяет наличие ордеров с опр. меджиком, а remove_sl удаляет:

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

Проблема в том, что в журнале эксперта появляются вот такие строки:

2011.05.11 21:40:19 Trades '726238' : failed cancel order #4375237 buy 0.00 at 0.00000 [Invalid request]
т.е. идут лишние обращения на торговый сервер с запросом удаления ордера, запрос на удаление которого уже отправлялся. 

 

По моему у меня проблема с закрытием и открытием позиции.

Каким-то образом вместо наличия позиции на 0.1 лот, я по факту имею несколько лотов. Видимо позиции по одному символу накладываются и объем позиции растет. Только так можно объяснить вышеуказанные проблемы с большими величинами стопов и большая разница при тестировании. Значит я не правильно провожу анализ наличия открытых сделок или не правильно закрываю следки. 

 Вот какую процедуру для определения наличия открытой позиции по символу я использую:

int Total()

{

 count=0;

 for (i=0; i<=PositionsTotal(); i++) 

   {

    if (PositionGetSymbol(i)==_Symbol) {count++;}

   }  

  return(count);

Ну естественно функция возвращает или 0 или 1.

Я использую следующую запись для открытия ордеров:

 if (Total()<1)

{

 if (#какая-то проверка по индикаторам#) OpenBuy(Lots,10,"EUR/USD (Buy)",102406); 

if (#какая-то проверка по индикаторам#)  OpenSell(Lots,10,"EUR/USD (Sell)",102406); 

Открываю бай и селл похоже:

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

  {

   MqlTradeRequest my_trade;

   MqlTradeResult my_trade_result;

   my_trade.action=TRADE_ACTION_DEAL;

   my_trade.symbol=Symbol();

   my_trade.volume=NormalizeDouble(volume,1);

   my_trade.price=NormalizeDouble(Bid,_Digits);

   my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);

   my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);

   my_trade.deviation=slippage;

   my_trade.type=ORDER_TYPE_SELL;

   my_trade.type_filling=ORDER_FILLING_AON;

   my_trade.comment=comment;

   my_trade.magic=magic;


   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))

     {

      time_oc=TimeLocal();

      md=0;

      Print("Код результата операции - ",my_trade_result.retcode);

     }

   else

     {

      Print("Код результата операции - ",my_trade_result.retcode);

      Print("Ошибка открытия ордера = ",GetLastError());

      }

return(0);

Закрываю сделки в главной процедуре аналогично:

if (Total()>0) TryToClose(); 

ТрайТуКлоуз такая:

int TryToClose()
{
 for (i=0; i<=PositionsTotal(); i++) 
   {
    if (PositionGetSymbol(i)==_Symbol) 
     {
      if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
       if(#какая-то проверка по индикаторам#) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
      if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
       if(#какая-то проверка по индикаторам#) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
     }
   }  
  return(0);

 Проверка по индикатором такая - если должна быть позиция Бай, а существует Селл, то делаем Бай.

 

Где я ошибся. Почему я получаю укрупненные позиции. 

 

 
Khomtchenko:

Всталяйте код через кнопку SRC

Будет читабельнее
Вы знаете различия между ордером МТ4 и ордером МТ5 ?
 

В mql4 ордеры бывают торговыми или отложенными.

В mql5 ордер - это отложенная сделка. Вход в ранок - это уже открытие позиции. При срабатывании ордера происходит открытие позиции.  Позиция по одному символу может быть одна, а ордеров сколько угодно. 

Спасибо за подсказку
 

Мне все какбЭ намекают на тупость. Пусть я тупой. Ну найдите у меня ошибки, чтобы я исправил. 

 
Khomtchenko:

Мне все какбЭ намекают на тупость. Пусть я тупой. Ну найдите у меня ошибки, чтобы я исправил. 

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

Я тут давно, о многих уже сложил своё мнение (каждый силён в чем то своём), вас я пока не знаю, поэтому и намекать ни на что не собираюсь.


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

Но вы зачем то прописали только один инструмент, если инструмент один то зачем циклом перебирать позиции?

ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:

bool  PositionSelect(
   string  symbol     // имя инструмента
   );
Причина обращения: