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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
И неплохо было бы закрывать с начало парные (противоположные) позы