вот так хорошо получается - (смотря для каких целей!?)
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(Ordertotal!=0)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
Большинство брокеров работают по такой же схеме: Result.deal == 0.
Например, в Сигналах самый популярный брокер для скальпинга.
Среди известных брокеров довольно сложно найти, где MT5 работает по иной схеме.
Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…
Если вы не против, всё-же попробуйте добавить проверку количества позиций
elseif(!PositionsTotal() && !OrdersTotal())
Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…
Ну так получите состояние этого ордера.Если тикет известен.
Сделка не прошла, цена исполнения равна 0.
Структура результата торгового запроса (MqlTradeResult)
В ответ на торговый запрос постановки ордера в торговую систему, торговый сервер возвращает данные, содержащие информацию о результате обработки торгового запроса в виде специальной предопределенной структуры MqlTradeResult.
structMqlTradeResult
{
uint retcode; // Код результата операцииulong deal; // Тикет сделки, если она совершенаulong order; // Тикет ордера, если он выставленdouble volume; // Объем сделки, подтверждённый брокеромdouble price; // Цена в сделке, подтверждённая брокеромdouble bid; // Текущая рыночная цена предложения (цены реквота)double ask; // Текущая рыночная цена спроса (цены реквота)string comment; // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)uint request_id; // Идентификатор запроса, устанавливается терминалом при отправке uint retcode_external; // Код ответа внешней торговой системы
};
Ну так получите состояние этого ордера.Если тикет известен.
Сделка не прошла, цена исполнения равна 0.
В том то и дело, что прошла. После окончания выполнения скрипта остается висеть одна или две позиции (в зависимости от того, сколько принтов вставить в код).
Код:
#define PRINT(A) Print(#A + " = " + (string)(A))
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!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.0514:25:14.738 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultRetcodeDescription() = done at 0.000002021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultDeal() = 02021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultOrder() = 22498886812021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultComment() = Request executed
2021.05.0514:25:14.821 Test (EURUSD,M1) EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED2021.05.0514:25:14.821 Test (EURUSD,M1) После открытия. PositionsTotal: 1, OrdersTotal: 12021.05.0514:25:14.899 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0514:25:14.899 Test (EURUSD,M1) Выход. PostionsTotal: 2
Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…
Все там успевает. Просто архитектурная особенность MT5.
Если вы не против, всё-же попробуйте добавить проверку количества позиций
Эта проверка присутствует в исходном коде.
Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
вот так хорошо получается - (смотря для каких целей!?)
вот так хорошо получается - (смотря для каких целей!?)
Не встревай. У них там специальный ДЦ который строит всяческие козни для отлова багов МТ.
специальный ДЦ который строит всяческие козни для отлова багов МТ.
Большинство брокеров работают по такой же схеме: Result.deal == 0.
Например, в Сигналах самый популярный брокер для скальпинга.
Среди известных брокеров довольно сложно найти, где MT5 работает по иной схеме.
вот так хорошо получается - (смотря для каких целей!?)
Большинство брокеров работают по такой же схеме: Result.deal == 0.
Например, в Сигналах самый популярный брокер для скальпинга.
Среди известных брокеров довольно сложно найти, где MT5 работает по иной схеме.
Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…
Если вы не против, всё-же попробуйте добавить проверку количества позиций
Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…
Сделал:
Результат:
Ну так получите состояние этого ордера.Если тикет известен.
Сделка не прошла, цена исполнения равна 0.
Структура результата торгового запроса (MqlTradeResult)
В ответ на торговый запрос постановки ордера в торговую систему, торговый сервер возвращает данные, содержащие информацию о результате обработки торгового запроса в виде специальной предопределенной структуры MqlTradeResult.
Ну так получите состояние этого ордера.Если тикет известен.
Сделка не прошла, цена исполнения равна 0.
В том то и дело, что прошла. После окончания выполнения скрипта остается висеть одна или две позиции (в зависимости от того, сколько принтов вставить в код).
Код:
Результат:
Ну не знаю для какого скальпинга так работать, что не успевать закрыть позицию…
Все там успевает. Просто архитектурная особенность MT5.
Если вы не против, всё-же попробуйте добавить проверку количества позиций
Эта проверка присутствует в исходном коде.
Я думаю, что две позиции это открытая и закрывающая. Не помешало-бы и попытаться получить типы этих двух позиций. Если они разнонаправлены, то это подтвердит мои подозрения…
Не бывает закрывающих позиций.
Руки еще не дошли выложить. В течение суток опубликую.
Не получилось, нашел проблемы.
Не получилось, нашел проблемы.
Ждем с нетерпением. Если чем-то помочь нужно, пишите.