Как правильно оформить новую структура запроса?

 
здравствуйте.
есть такой код (часть более объемного кода.)

bool sendorder(double price, double volume)
{
   counter++;
   mqltraderequest request = {0};
   mqltraderesult  result  = {0};
  
//---заполняем поля торгового запроса
   request.action       = trade_action_deal;       // тип выполняемого действия
   request.symbol       = _symbol;                 // имя торгового инструмента
   request.volume       = volume;                  // запрашиваемый объем сделки в лотах
   request.price        = price;                   // цена  
   request.type         = order_type_buy;          // тип ордера
   request.tp           = price + 950*_point;     // цена, по которой сработает take profit ордер при движении цены в благоприятном направлении
   request.sl           = 0;                       // цена, по которой сработает stop loss ордер при движении цены в неблагоприятном направлении
   request.type_filling = order_filling_fok;       // тип ордера по исполнению
   request.type_time    = order_time_gtc;
   
   // подсчитываем средства на нашем счете
      double accountequity = accountinfodouble(account_equity);
      
   // подсчитываем баланс аккаунта  
      double accountbalance = accountinfodouble(account_balance);
      
   // разница между балансом и средствами на счете
      double balanceminusequity = accountbalance - accountequity;
   
   //--- проверяем состояние баланса счета при вхождении в позицию.
   if(accountequity < accountbalance)
   {
   mqltraderequest request_2 = {0};
   mqltraderesult  result_2  = {0};
   request_2.action       = trade_action_deal;       // тип выполняемого действия
   request_2.symbol       = _symbol;                 // имя торгового инструмента
   request_2.volume       = volume;                  // запрашиваемый объем сделки в лотах
   request_2.price        = price;                   // цена  
   request_2.type         = order_type_sell;          // тип ордера
   request_2.type_filling = order_filling_fok;       // тип ордера по исполнению
   request_2.type_time    = order_time_gtc;
   
   print("условия на счете не соответствуют параметрам для входа в позицию");
   print("разница между балансом и средствами на счете: ", doubletostring(balanceminusequity, 2), "$");
   print("количество открытых позиций: ", positionstotal());
   return (false);
   };
}//-------------------------------------------------------------------------------------------------+
задача стоит - в случае определённого условия(связанного с балансом на аккаунте) прекратить доливать позиции и всё что есть(по данному инструменту) продать.
(на данный момент в принтах(в журнале) у меня выводится, что позиция по прежнему сохраняется в наличии.)
вопрос:
как это правильно оформить?)
(в инете и документации не удается найти ни одного примера.)
так же хотелось бы понять как покупать продавать позицию по лимитному ордеру.

(с точки зрения синтаксиса.)

если прописать вот это:

else{
   //---заполняем поля торгового запроса
   request.action       = trade_action_pending;       // тип выполняемого действия
   request.symbol       = _symbol;                 // имя торгового инструмента
   request.volume       = volume;                  // запрашиваемый объем сделки в лотах
   request.price        = price;                   // цена  
   request.type         = order_type_buy_limit;          // тип ордера
   request.tp           = price + 950*_point;      // цена, по которой сработает take profit ордер при движении цены в благоприятном направлении
   request.sl           = 0;                       // цена, по которой сработает stop loss ордер при движении цены в неблагоприятном направлении
   request.type_filling = order_filling_fok;       // тип ордера по исполнению
   request.type_time    = order_time_gtc;
   };


то вход в сделку вообще даже и не начинается. на какие критерии необходимо обращать внимание, при оформлении(в таких случаях) структуры mqltraderequest request ?

(иными словами, почему у меня это все работает не корректно и как все это правильно организовать?)
p.s. ещё такой момент хотел выяснить:
если я покупаю по лимитному ордеру позицию - то тейк профит работает как лимитный ордер или как рыночный?
 
так. вроде разобрался с условиями и продажей рыночными ордерами.
(проблема не срабатывания была в том, что из за высокой скорости движения котировки ордер рыночный почему то отказывается выполнять поставленную задачу.
хотя для меня лично не понятно почему. request.type_time = order_time_gtc; означает что он ордер должен быть в заявке - пока не будет исполнен.

ulong devitation = 1000000000;
иными словами у меня рыночный ордер висит днями(при тестировании на истории) и всё это время не срабатывает получается.
даже поставил специально.но на малых скачках выйти рыночным ордером из позиции все же удается.
никто не в курсе - почему так происходит?)

p.s. c тем как работают лимитные ордера я так пока что и не разобрался..
(то докупается все это дело как попало из за них. то вообще не хочет ничего покупать с самого начала.)
 
Mike_Kharkov:

p.s. ещё такой момент хотел выяснить:

если я покупаю по лимитному ордеру позицию - то тейк профит работает как лимитный ордер или как рыночный?
Профит всегда рыночный. И всегда по текущей цене. А она может не совпасть с твоим профитом.
Так же учитывай, что лимитный ордер может открыться не по твоей цене. А по цене намного хуже. Это возможно во время гэпов.
 

правильне будет не оформлять самому запрос, а воспользоваться классом ctrade.

сверху подключаем файл с классом: 

#include <trade/trade.mqh>
ctrade trade;  
потом, по мере необходимости пишем "trade." и в открывшемся списке выбираем нужный метод. 
 
integer:

правильне будет не оформлять самому запрос, а воспользоваться классом ctrade.

сверху подключаем файл с классом: 

потом, по мере необходимости пишем "trade." и в открывшемся списке выбираем нужный метод. 
   а самому нельзя, что ли получается это дело оформить?
   не ужели это такая трудная задача?
 
mike_kharkov:
   а самому нельзя, что ли получается это дело оформить?
   не ужели это такая трудная задача?

можно и самому, но зачем делать лишнюю работу, которую уже сделали за вас в лучшем виде?

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

 
integer:

можно и самому, но зачем делать лишнюю работу, которую уже сделали за вас в лучшем виде?

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

   получается при работе в первую очередь необходимо смотреть что умеет класс и если он это не может - то только тогда писать самому?
   p.s. а синтаксис методов класса, со временем, не может точно так же перестать работать? )
   просто я , как вариант рассматривал то, что зная mql5 можно будет потом легче освоить с++(для других задач) т.к. слышал что языки похожи.
   (так ли это?)
   а если работать чисто по классам то такой практикой я вряд ли себе скилов в программировании добавлю.
   (как мне кажется.)
   но в любом случае лишняя работа(если её много) мне точно ни к чему. )
 
mike_kharkov:
   получается при работе в первую очередь необходимо смотреть что умеет класс и если он это не может - то только тогда писать самому?
   p.s. а синтаксис методов класса, со временем, не может точно так же перестать работать? )

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

 
Сейчас попробовал свой код запустить на демо(а не на тестере стратегий) и позиция не докупается там где это необходимо.
В чем может быть проблема?
P.S. В журнале(не в тестере) такое впечатление, что все замерло после первого тика.
(может конечно так и должно быть.)
 

Исправте:

request.type_filling = order_filling_fok;       // тип ордера по исполнению
   request.type_time    = order_time_gtc;

 на 

request.type_filling = ORDER_FILLING_IOC;
  request.type_time    = ORDER_TIME_DAY;
 
Integer:

можно и самому, но зачем делать лишнюю работу, которую уже сделали за вас в лучшем виде?

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

А в классе - куча мусора, который съедает время.

И перекомпилить придётся в обоих случаях.

Чем проще код - тем лучше!