Как кодировать? - страница 6

 

Код ошибки: 4109

Всем привет:

Я написал скрипт для закрытия всех сделок, включая отложенные ордера, но после тестирования был разочарован. Функции: OrderClose и Orderdelete не закрывают сделки. При вызове функции GetLastError я получаю код ошибки: 4109, который определяется в заголовочном файле ошибок как TRADE_NOT_ALLOWED.

Я даже пытался выполнить те скрипты, которые поставляются с платформой, но безуспешно.

Я надеюсь, что кто-нибудь сможет решить эту проблему.

Спасибо,

Файлы:
closeall2.mq4  2 kb
 

Хорошо, попробуйте вот это. Я думаю, что переменные Lots и Price должны быть двойными, а не целыми. Надеюсь, это поможет

//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

//+------------------------------------------------------------------+

#property copyright "FX5"

#property link " "

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

for(int i=0;i<Total;i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

//+------------------------------------------------------------------+
 

попробуйте это

FX5:
Всем привет:

Я написал скрипт для закрытия всех сделок, включая отложенные ордера, но после тестирования был разочарован. Функции: OrderClose и Orderdelete не закрывают сделки. При вызове функции GetLastError я получаю код ошибки: 4109, который определяется в заголовочном файле ошибок как TRADE_NOT_ALLOWED.

Я даже пытался выполнить те скрипты, которые поставляются с платформой, но безуспешно.

Надеюсь, кто-нибудь сможет решить эту проблему.

Спасибо,

В metatrader зайдите в tools -> options, нажмите на вкладку expert advisor и выберите allow live trading, а также нажмите allow dll imports и снимите галочку confirm calls. Я написал несколько скриптов и столкнулся с той же проблемой.

 
firedave:
Хорошо, попробуйте этот вариант. Я думаю, что переменные Lots и Price должны быть двойными, а не целыми. Надеюсь, это поможет
//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

//+------------------------------------------------------------------+

#property copyright "FX5"

#property link " "

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

for(int i=0;i<Total;i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

//+------------------------------------------------------------------+

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

Поэтому, вместо " for(int i=0;i=0;i--) "

 

Спасибо firedave за модификацию кода. Это была небольшая ошибка, на которую я не обратил внимания.

Crepuscular, большое спасибо за подсказку. Я мог бы потратить столетие, прежде чем нашел решение. Наконец, у меня есть рабочий код.

 

Мишель, это была очень умная записка, большое спасибо.

 

функция получения максимальной просадки

я хотел бы написать функцию, которая получает максимальную просадку от сделок, которые были закрыты. я придумал два решения.

1. вычислять просадку, пока сделка все еще активна. сохранять число в глобальной переменной и записывать данные в файл в соответствии с номером тикета. MT4 всегда должен быть онлайн.

2. получить просадку, взяв самый высокий или самый низкий максимум с 1-минутного графика. проблема здесь в том, что мы должны иметь 1-минутную историю для сделки. (Я бы использовал этот метод, если бы мог получить необходимые 1-минутные бары, если они еще не загружены).

Я хотел бы придумать более приятный способ получения максимальной просадки.

Любой вклад будет принят с благодарностью.

 
harriss:
Я хотел бы написать функцию, которая получает максимальную просадку по закрытым сделкам. Я придумал два решения.

1. рассчитать просадку, пока сделка все еще активна. сохранить число в глобальную переменную и записать данные в файл в соответствии с номером тикета. MT4 всегда должен быть онлайн.

2. получить просадку, взяв самый высокий или самый низкий максимум с 1-минутного графика. проблема здесь в том, что мы должны иметь 1-минутную историю для сделки. (Я бы использовал этот метод, если бы мог получить необходимые 1-минутные бары, если они еще не загружены).

Я бы хотел придумать более приятный способ получения максимальной просадки.

Любой вклад будет оценен по достоинству.

Салам Харрисс,

Что вы имели в виду под "просадкой"?

Вы имеете в виду максимальный убыток по одной из закрытых сделок?

 

просадка

Под просадкой я понимаю самую низкую точку в торговле. Например, если сделка достигла стоплосса, то стоплосс будет просадкой. Если сделка закончилась с положительной стороны и в какой-то момент была -15 пунктов, то просадка будет равна 15. И, наконец, если сделка закрылась на уровне -15 пунктов, но в какой-то момент была на уровне -30, то просадка будет равна 30.

 

Как закодировать алерты/сигналы для индикаторов?

Здравствуйте, я хотел бы узнать больше о том, как кодировать алерты.

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

Я просмотрел некоторые индикаторы с оповещениями и скопировал общие функции оповещений, которые я видел, в другие индикаторы, которые я хотел иметь. Я получил смешанные результаты.

Я заметил, что основные функции, вызываемые для оповещений, - это функция Alert(), функция Comment() и функция Playsound(). Пока что я больше всего знаком с функцией Alert(). Есть ли существенная разница между Alert() и Playsound(), например?

Общая проблема заключается в том, что я не знаю, как закодировать оповещения так, чтобы они были, с одной стороны, заметны, а с другой - не отвлекали. Например, если использовать функцию Alert() для некоторых кроссов, а индикатор не отпечатался окончательно на текущем баре, то оповещение может повторяться снова и снова, и мне трудно отключить оповещение. Обычно мне приходится менять таймфрейм графика.

Во-первых, есть ли простой способ отключить/деактивировать оповещение только для текущего бара?

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

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

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

Я также знаю, что советники могут быть созданы для подачи предупреждений, и что есть кнопка, которая позволяет легко включать и выключать их предупреждения. Однако проблема с советниками заключается в том, что я заметил, что другая важная программа, которую я запускаю одновременно с MetaTrader, кажется, испытывает помехи, когда советники активированы, и работает вяло.

Есть ли другие решения этой проблемы?

Если есть индикаторы, которые имеют код оповещения, который избегает перечисленных мной подводных камней и может служить хорошим примером того, как кодировать и оповещать, не могли бы вы направить меня к нему и/или опубликовать его?

Большое спасибо.

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