Выставление отложенных ордеров - страница 3

 

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

Вот что в итоге вышло:

#property version   "1.00"

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>                                         //подключаем библиотеку для совершения торговых операций                              



input double lvlpercent = 1;

input double percenttp = 1;

input double Lots = 1;



double            iMAClose_buf[];

double            iMACloseD1_buf[];                                   //динамический массив для хранения цены закрытия каждого бара



string            my_symbol;                                       //переменная для хранения символа

ENUM_TIMEFRAMES   my_timeframe;                                    //переменная для хранения таймфрейма



CTrade            m_Trade;                                         //структура для выполнения торговых операций

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

   my_symbol = Symbol();                                             //сохраним текущий символ графика для дальнейшей работы советника именно на этом символе

   my_timeframe=PERIOD_CURRENT;                                    //сохраним текущий период графика для дальнейшей работы советника именно на этом периоде

   ArraySetAsSeries(iMAClose_buf,true);                               //устанавливаем индексация для массива Close_buf как в таймсерии

   ArraySetAsSeries(iMACloseD1_buf,true);                           //устанавливаем индексация для массива CloseH1_buf как в таймсерии

   return(0);                                                      //возвращаем 0, инициализация завершена

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   ArrayFree(iMAClose_buf);                                           //освобождаем динамический массив Close_buf от данных

   ArrayFree(iMACloseD1_buf);                                         //освобождаем динамический массив CloseH1_buf от данных  

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   

      int err2=0;                                                     //переменная для хранения результатов работы с ценовым графиком

      int err3=0;                                                     //переменная для хранения результатов работы с ценовым графиком H1

      

      err2=CopyClose(my_symbol,my_timeframe,1,2,iMAClose_buf);        //копируем данные ценового графика в динамический массив Close_buf  для дальнейшей работы с ними

      err3=CopyClose(my_symbol,PERIOD_D1,0,2,iMACloseD1_buf);         //копируем данные ценового графика в динамический массив CloseH1_buf  для дальнейшей работы с ними

      

      double linebuy = NormalizeDouble((iMACloseD1_buf[1] * lvlpercent),0);

      double linesell = NormalizeDouble((iMACloseD1_buf[1] / lvlpercent),0);

      double tpbuy = linebuy * percenttp; 

      double tpsell = linesell/percenttp;

     

      if (yesnoposition(linebuy,linesell)==false)   // если нет открытых позиций проверяем ордера

       {

          if(getbuyorder(linebuy,linesell)==false)  // проверяем количество ордеров на buy

           {

            openbuy(linebuy,linesell,tpbuy,tpsell);

           }

          if(getsellorder(linebuy,linesell)==false) // проверяем количество ордеров на sell

           {

            opensell(linebuy,linesell,tpbuy,tpsell);

           }    

       }

 }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

bool getbuyorder(double linebuy, double linesell)

  {

    int orders=OrdersTotal();

     for(int i=0;i<orders;i++)

     {

      ResetLastError();

      ulong ticket=OrderGetTicket(i);

      if(ticket!=0)                             // если ордер успешно скопирован в кэш, работаем с ним

        {

         if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_LIMIT)

           {

            if(OrderGetDouble(ORDER_PRICE_OPEN)==linebuy)

            {

               return(true);

            }

           }

        }

      else         // вызов OrderGetTicket() завершился неудачно

        {

         PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());

        }

    }

   return(false);

}  

//======================================================= 

bool getsellorder(double linebuy, double linesell)

{

int orders=OrdersTotal();

for(int i=0;i<orders;i++)

    {

      ResetLastError();

      ulong ticket=OrderGetTicket(i);

      if(ticket!=0)                    // если ордер успешно скопирован в кэш, работаем с ним

        {

         if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_STOP || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_LIMIT)

           {

            if(OrderGetDouble(ORDER_PRICE_OPEN)==linesell)

            {

               return(true);

            }

           }

        }

      else         // вызов OrderGetTicket() завершился неудачно

        {

         PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());

        }

 }

return(false);

}

//=====================================================================================

bool yesnoposition(double linebuy, double linesell)

{

int positions=PositionsTotal();

for(int i=0;i<positions;i++)

     {

      ResetLastError();

       {

         if(PositionGetDouble(POSITION_PRICE_OPEN)==linebuy || PositionGetDouble(POSITION_PRICE_OPEN)==linesell)

           {

            return(true);

           }

       }

     }

    return(false);

} 

//=====================================================

void openbuy(double linebuy, double linesell, double tpbuy, double tpsell)

{

 if(SymbolInfoDouble(my_symbol,SYMBOL_ASK)<linebuy)

  { 

   m_Trade.BuyStop(Lots,linebuy,my_symbol,linesell,tpbuy,ORDER_TIME_DAY,0,"BuyStop");  // если мы тут buy ордера нет, выставляем его

   Sleep(3000);

  }

 else

  {

   m_Trade.BuyLimit(Lots,linebuy,my_symbol,linesell,tpbuy,ORDER_TIME_DAY,0,"BuyLimit");  // если мы тут buy ордера нет, выставляем его

   Sleep(3000);

  }

}

//=====================================================

void opensell(double linebuy, double linesell, double tpbuy, double tpsell)

{

 if(SymbolInfoDouble(my_symbol,SYMBOL_BID)>linesell)

  {

   m_Trade.SellStop(Lots,linesell,my_symbol,linebuy,tpsell,ORDER_TIME_DAY,0,"SellStop");  // если мы тут sell ордера нет, выставляем его

   Sleep(3000);

  }

 else

  {

   m_Trade.SellLimit(Lots,linesell,my_symbol,linebuy,tpsell,ORDER_TIME_DAY,0,"SellLimit");  // если мы тут sell ордера нет, выставляем его

   Sleep(3000);

  }

}

 

Что не так? народ подскажите почему он удаляет выставленный лимитник?

 

Зачем Вы делаете:

int positions=PositionsTotal();

 Достаточно:

if ( PositionSelect(_Symbol))
{
  //Позиция существует
}

 В МТ5 по одному символу может быть открыта только ОДНА позиция!

Тоже самое с ордером.

Установив ордер, Вы получили его билет (tiket)

Тогда:

if ( OrderSelect( ticket ) )
{
  //Ордер существует.
}
 
что за кнопка? и что она дает?
 
этот кусок кода взял в статье от Разрабов :) они советовали зыыы...
 
suharik:
что за кнопка? и что она дает?

Она приводит код у удобоваримый вид.

( кнопка вверху ) 

 
suharik:
этот кусок кода взял в статье от Разрабов :) они советовали зыыы...
Вы спросили - я ответил...
 

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

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

 
suharik:

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

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

То, что у Вас написано (код) - вообще не должно работать. :)

P/S зачем задавать вопросы, если Вы сами знаете ответ? 

 
ну как бы он работает, и единственная ошибка это исчезновение ордеров, именно про нее я и спрашивал, т.к. ответа найти сам не могу.
 
suharik:
ну как бы он работает, и единственная ошибка это исчезновение ордеров, именно про нее я и спрашивал, т.к. ответа найти сам не могу.

Повторю...

Чтобы совершать действия над ордером, нужно знать его БИЛЕТ ( TICKET ) 

 

P/S Если Вы хотите, чтобы Ваш советник нормально работал, забудьте команду Sleep() 

Причина обращения: