- нужна помощь в кодировании, пожалуйста
- Backtest/optimize/MT4 Исторические данные
- Как кодировать?
Я очень новичок в кодировании mql4 и уже создал свой первый советник. Моя единственная проблема заключается в том, что я не могу заставить его открывать сделки более чем на одной паре. В разделе советника на терминале рядом с журналом, он посылает поток ошибки, invalid ticket for orderclose function, хотя советник прекрасно открывает и закрывает сделки на одной паре. Не мог бы кто-нибудь помочь.
Как вы ожидаете, что мы узнаем, если вы не покажете ни свой код, ни журнал ошибок?
Мы не читаем мысли! Если вы хотите получить нашу помощь, вам придется показать ваш код, а также ошибки, которые он выдает (результаты в журнале). Также будет полезно узнать, на каких валютных парах и таймфреймах вы тестируете, когда мы посмотрим на ваш код.
Также, пожалуйста, обратите внимание, что на MetaTrader 4 в тестере стратегий можно одновременно тестировать только одну валюту. Если ваш советник торгует несколькими валютами одновременно с одного графика, вы не сможете протестировать его в тестере стратегий - только на реальном или демо-счете!
Matt_Townsend: даже если советник прекрасно открывает и закрывает сделки на одной паре. | Вот почему я рекомендую Не торгуйте несколькими валютами в одном советнике
|
Пожалуйста, отредактируйте свое сообщение и используйте кнопку SRC, чтобы добавить свой код! Не копируйте/вставляйте стандартный текст, так как его трудно читать. Я уверен, что вы можете видеть из других тем, как это должно быть сделано. Пожалуйста, используйте кнопку SRC для размещения вашего кода.
EDIT: Как и просили ранее - . .. Также будет полезно узнать, на каких валютных парах и таймфреймах вы тестируете ...
EDIT2: Как и просили ранее- ... а также ошибки, которые он выдает (результаты в журнале) ...
Пожалуйста, отредактируйте свое сообщение и используйте кнопку SRC, чтобы добавить свой код! Не копируйте/вставляйте стандартный текст, так как его трудно читать. Я уверен, что вы можете видеть из других тем, как это должно быть сделано. Пожалуйста, используйте кнопку SRC для размещения вашего кода.
//| Simple Moving Average Crossover Strategy.mq4 |
//| Matthew Townsend |
//+------------------------------------------------------------------+
#property version "1.05"
#property strict
//---
//---Inputs
extern double Lots =0.01;
extern int FastMA =5;
input int FastMAMode =MODE_EMA;
extern int SlowMA =8;
input int SlowMAMode =MODE_SMA;
//+----------------------------------------+
//|undesirables |
//+----------------------------------------+
int init()
{
//----
//----
return(0);
}
int deinit()
{
//----
//----
return(0);
}
//+---------------------------------------------+
//|System start |
//+---------------------------------------------+
int start()
{
double fastma, slowma;
int ticket, total;
//---define Ma's
fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
total = OrdersTotal();
//---Start operations
if(total < 1)
{
if(fastma > slowma)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
if(fastma < slowma)
{
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
return(0);
}
bool ans;
if(OrderType()==OP_BUY)
{
while(fastma < slowma)
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
if(OrderType()==OP_SELL)
{
while(fastma > slowma)
{
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
return(0);
}
//+-----------------------------------------------------------------------------------+
Я попросил вас отредактировать предыдущее сообщение, а не добавлять новое, чтобы не делать тему такой длинной!
Я тестировал на 1-часовом таймфрейме, EURUSD и 1-часовом GBPUSD.
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
Вы неправильно проверяете результат операции закрытия.
С точки зрения логики в вашем советнике есть несколько проблем, но на данный момент он работает без ошибок с моей стороны в тестере стратегий, поэтому, пожалуйста, предоставьте список ошибок, которые вы получаете!
Для следующего кода уже есть два предупреждения компилятора:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
Вы неправильно проверяете результат операции закрытия.
С точки зрения логики в вашем советнике есть несколько проблем, но на данный момент он работает без ошибок с моей стороны, поэтому, пожалуйста, предоставьте список ошибок, которые вы получаете!
Единственная ошибка, которую я получаю от советника, этоinvalid ticket for orderclose function, с цифрой рядом, я бы хотел показать фактический лог, но на втором графике с запущенным советником он ничего не делает, так как обычно он пытается открыть сделку немедленно. Если и когда журнал начнет заполняться ошибкой, как мне показать вам фактический журнал?
Выделите нужные линии с помощью Click, Ctrl-Click или Shift-Click (стандартная операция windows), затем щелкните правой кнопкой мыши по выделению и выберите "Copy"!
EDIT: Что касается кода, вы используете OrderSelect, но вы всегда предполагаете, что он работает каждый раз. А когда он не срабатывает, вы просто продолжаете использовать функции деталей заказа, такие как OrderTicket() в вашем закрытии, которые могут потерпеть неудачу, если первоначальный OrderSelect() тоже не сработал. Как я уже сказал, в вашем коде много логических проблем!
bool ans;
//You do not select an order
{
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
Единственная ошибка, которую я получаю от советника -invalid ticket for orderclose function, с цифрой рядом, я бы хотел показать фактический лог, но на втором графике с запущенным советником он ничего не делает, так как обычно он пытается открыть сделку немедленно. Если и когда журнал начнет заполняться ошибкой, как мне показать вам фактический журнал?
Еще одно очень важное замечание по поводу использования вашего советника на нескольких валютных парах или тайм-фреймах.
Ваш код не использует выбор "магического числа" и не проверяет используемый символ (или "магическое число") при проверке открытых ордеров в истории. Таким образом, по сути, ваш советник не будет корректно работать ни с самим собой, ни с другими советниками.
Как есть, вы можете использовать этот советник только сам по себе, без других советников, даже на другом графике!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования