Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 16

 

вот так хорошо получается - (смотря для каких целей!?)

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(Ordertotal!=0)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex:

вот так хорошо получается - (смотря для каких целей!?)

Не встревай. У них там специальный ДЦ который строит всяческие козни для отлова багов МТ.

 
Alexey Viktorov:

специальный ДЦ который строит всяческие козни для отлова багов МТ.

Большинство брокеров работают по такой же схеме: Result.deal == 0.

Например, в Сигналах самый популярный брокер для скальпинга.

Среди известных брокеров довольно сложно найти, где MT5 работает по иной схеме.

 
SanAlex:

вот так хорошо получается - (смотря для каких целей!?)


Что именно "хорошо получается"?
У тебя ошибка в коде, на которую уже указали выше.
 
fxsaber:

Большинство брокеров работают по такой же схеме: Result.deal == 0.

Например, в Сигналах самый популярный брокер для скальпинга.

Среди известных брокеров довольно сложно найти, где MT5 работает по иной схеме.

Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…

Если вы не против, всё-же попробуйте добавить проверку количества позиций

    else if(!PositionsTotal() && !OrdersTotal())

Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…

 
Ihor Herasko:

Сделал:

Результат:

Ну так получите состояние этого ордера.Если тикет известен.

Сделка не прошла, цена исполнения равна 0.

Структура результата торгового запроса (MqlTradeResult)

В ответ на торговый запрос постановки ордера в торговую систему, торговый сервер возвращает данные, содержащие информацию о результате обработки торгового запроса в виде специальной предопределенной структуры MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov:

Ну так получите состояние этого ордера.Если тикет известен.

Сделка не прошла, цена исполнения равна 0.

В том то и дело, что прошла. После окончания выполнения скрипта остается висеть одна или две позиции (в зависимости от того, сколько принтов вставить в код).

Код:

#define PRINT(A) Print(#A + " = " + (string)(A))

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
      if (OrderSelect(Trade.ResultOrder()))
         PRINT(OrderGetInteger(ORDER_STATE));
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Результат:

2021.05.05 14:25:14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 14:25:14.821 Test (EURUSD,M1)        EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED
2021.05.05 14:25:14.821 Test (EURUSD,M1)        После открытия. PositionsTotal: 1, OrdersTotal: 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov:

Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…

Все там успевает. Просто архитектурная особенность MT5.

Если вы не против, всё-же попробуйте добавить проверку количества позиций

Эта проверка присутствует в исходном коде.

Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…

Не бывает закрывающих позиций.

 
fxsaber:

Руки еще не дошли выложить. В течение суток опубликую.

Не получилось, нашел проблемы.

 
fxsaber:

Не получилось, нашел проблемы.

Ждем с нетерпением. Если чем-то помочь нужно, пишите.

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