void init() { } void deinit() { } void start() { CloseOrders(); DeleteOrders(); } void CloseOrders() { int cnt = OrdersTotal(); for (int i=cnt-1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; int type = OrderType(); if (type == OP_BUY) { RefreshRates(); CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID)); } if (type == OP_SELL) { RefreshRates(); CloseOrder(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK)); } } } void DeleteOrders() { int cnt = OrdersTotal(); for (int i=cnt-1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; int type = OrderType(); if (type == OP_BUYSTOP || type == OP_SELLSTOP || type == OP_BUYLIMIT || type == OP_SELLLIMIT) { DeleteOrder(OrderTicket()); } } } //----- #include <stdlib.mqh> #include <stderror.mqh> int SleepOk = 2000; int SleepErr = 6000; int Slippage = 3; bool CloseOrder(int ticket, double lot, double price) { if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) return(false); int dig = MarketInfo(OrderSymbol(), MODE_DIGITS); string _lot = DoubleToStr(lot, 1); string _price = DoubleToStr(price, dig); Print("CloseOrder ", ticket, ", ", _lot, ", ", _price, ", ", Slippage); bool res = OrderClose(ticket, lot, price, Slippage); if (res) { Sleep(SleepOk); return (res); } int code = GetLastError(); Print("CloseOrder failed: ", ErrorDescription(code), " (", code, ")"); Sleep(SleepErr); return (false); } bool DeleteOrder(int ticket) { Print("DeleteOrder ", ticket); bool res = OrderDelete(ticket); if (res) { Sleep(SleepOk); return (res); } int code = GetLastError(); Print("DeleteOrder failed: ", ErrorDescription(code), " (", code, ")"); Sleep(SleepErr); return (false); }
Спасибо RickD, но данный эксперт закрывает одним тиком только один ордер.
Из функций можно собрать люой функционал, например так:
http://www.alpari-idc.ru/ru/experts/articles/9.html
http://www.alpari-idc.ru/ru/experts/articles/9.html
Я закрываю так:
if(условие) { cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; RefreshRates(); OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); zz=0; cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if((cmd==0||cmd==1))lots=OrderLots(); if(cmd==2||cmd==3||cmd==4||cmd==5)OrderDelete(OrderTicket()); if(cmd==0) mod=OrderClose(OrderTicket(),lots,MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) mod=OrderClose(OrderTicket(),lots,MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); Sleep(1000); if(mod) { str="Сбойная ситуация. Закрываем все ордера"; Print(str); if(Sound==1)PlaySound("alert2.wav"); zz=1; break; } } if(zz==0) { str="Не могу закрыть ордер на паре "+OrderSymbol()+". Срочно проверьте связь терминала с ДЦ и закройте этот ордер!!!"; Print(str); PlaySound("disconnect.wav"); } Sleep(5000); } }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
И неплохо было бы закрывать с начало парные (противоположные) позы