Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Еще одно очень важное замечание по поводу использования вашего советника на нескольких валютных парах или тайм-фреймах.
Ваш код не использует выбор "магического числа" и не проверяет используемый символ (или "магическое число") при проверке открытых ордеров в истории. Таким образом, по сути, ваш советник не будет корректно работать ни с самим собой, ни с другими советниками.
В таком виде советник можно использовать только сам по себе, без других советников, даже на другом графике!
bool ans;
//You do not select an order
if(OrderType()==OP_BUY){
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);
}
}
Большое спасибо за помощь с моим кодом до сих пор и ваше время, я постараюсь внести необходимые коррективы.
Поскольку у вас слишком много логических проблем в вашем советнике, я предлагаю вам взглянуть на примеры кода от MetaQuotes, а именно"Moving Average.mq4" и/или "MACD Sample.mq4" и строить на их основе, пока вы не поймете основные принципы работы советника.
Я прикрепил файлы, но вы найдете их в папке "MQL4\Experts".
EDIT: Что касается кода, вы используете OrderSelect, но вы всегда предполагаете, что он работает каждый раз. А когда он не срабатывает, вы просто продолжаете использовать функции деталей заказа, такие как OrderTicket() в вашем закрытии, которые могут потерпеть неудачу, если первоначальный OrderSelect() тоже не сработал.
После того, как я обратил внимание на ваше редактирование.....
Я всегда предполагал, что OrderSelect() будет потерян при появлении нового тика.
Поэтому я проверил и обнаружил, что если ордер выбран, то он остается выбранным даже при последующих новых тиках.
Каждый день узнаю что-то новое :)
Я всегда предполагал, что OrderSelect() будет потерян при новом тике.
Поэтому я проверил и обнаружил, что если ордер выбран, то он остается выбранным даже при последующих новых тиках.
Каждый день узнаю что-то новое :)
Еще одно очень важное замечание по поводу использования вашего советника на нескольких валютных парах или тайм-фреймах.
Ваш код не использует выбор "магического числа" и не проверяет используемый символ (или "магическое число") при проверке открытых ордеров в истории. Таким образом, по сути, ваш советник не будет корректно работать ни с самим собой, ни с другими советниками.
В таком виде этот советник можно использовать только сам по себе, без других советников, даже на другом графике!
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
//---Check Order Type
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
if(OrderType()==OP_SELL)
{
if(fastma > slowma)
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
}
Вот секция OrderClose, я больше не получаю ошибку недействительного тикета, но теперь я получаю недействительную цену.
Вот прямо из журнала
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
...
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
Вот раздел OrderClose, я больше не получаю ошибку недействительного билета, но теперь я получаю недействительную цену.
Вот прямо из журнала
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function
Не используйте Bid/Ask при закрытии, используйте OrderClosePrice(). Это будет автоматически хорошая цена.
Должен ли я просто заменить его в функции OrderClose? И если да, то должен ли я удалить OrderClosePrice в функции print под ним?
Редактировать:
Я только что сделал это, но теперь он не удерживает ни одной открытой позиции. Просто открывает и закрывает позиции, хотя теперь у него нет проблем с работой на нескольких парах.
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
Нет необходимости в возврате или прерывании, так как вам нужно завершить цикл.
Кроме того, ваша ошибка зависит от того, что
if(fastma < slowma)
false, а не от того, не сработала ли функция OrderClose().
if(OrderType()==OP_BUY)
{
if(fastma<slowma)
{
if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
Print("Order Closed : ",OrderClosePrice());
else
Print("Error : ",GetLastError())
}
}