Теперь я вставляю билет и лоты в OrderClose без использования OrderTicket() и OrderLots(), но это не закрывает ордер. Пожалуйста, помогите.
Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите, чтобы вход был на новом баре и выход при выполнении условий? Вот что я думаю:
Сначала вы подсчитываете ордера с помощью OrdersTotal().
Затем вычисляете свои переменные
Если в рынке есть ордера, проверьте, должны ли они быть закрыты.
Если ордеров на рынке нет, проверьте, выполнены ли условия входа.
Дайте мне знать, если у вас есть какие-либо вопросы.
//+------------------------------------------------------------------+//| chuale_test1.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.abc.com"#property version"1.00"#property strictexterndouble TakeProfit=500;
externdouble Lots=0.1;
externdouble StopLoss=300;
double bar1;
double bar2;
double bar3;
int total,ticket;
datetime previousTime;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int init()
{
//---//---return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//---return(0);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+int start()
{
total=OrdersTotal();
/*
counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
IndicatorCounted() is actually for indicators not EA
*/
bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
/*
Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
"Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
"Bar3 = "+DoubleToString(bar3,Digits)+"\n"
);
*///Close any orders if conditions are metif(total>0)
{
if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
}
if(Time[0]==previousTime) return(0); //EA will not go past this point unless it is a new bar
previousTime=Time[0]; // If it was a new bar , it's old now but continue to the end// if no order open and new barif(total<1)
{
if(bar2>1)// if condition met
{
//place buy order
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failedreturn(0);
}
// or if conditions for sell metif(bar2<-1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
return(0); //return to start
}
}
return(0);
}
//+------------------------------------------------------------------+
да, теперь он может закрыться. спасибо GumRai. теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
chuale: да, теперь он может закрыться. спасибо GumRai. теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
Если вы используете OrderTicket(), то просто убедитесь, что вы сначала используете OrderSelect(), а также убедитесь, что это та сделка, которую вы хотите закрыть.
chuale: Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
Привет, Чуале,
Вот простой способ выбора ордеров и закрытия ордеров по символу и по номеру Magic:
//+------------------------------------------------------------------+//| chuale_test1.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.abc.com"#property version"1.00"#property strictexterndouble TakeProfit=500;
externdouble Lots=0.1;
externdouble StopLoss=300;
externint MagicNumber = 12345;
externint Slip = 3;
double bar1;
double bar2;
double bar3;
int myTrades,ticket;
datetime previousTime;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int init()
{
//---//---return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//---return(0);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+int start()
{
myTrades = CountTrades();//Count trades function counts this EA trades only//
bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
//Close any orders if conditions are metif(myTrades>0)
{
if(bar3<-1) CloseThisSymbolAll();
if(bar3>1) CloseThisSymbolAll();
}
if(Time[0]==previousTime) return(0); //EA will not go past this point unless it is a new bar
previousTime=Time[0]; // If it was a new bar , it's old now but continue to the end// if no order open and new barif(myTrades<1)
{
if(bar2>1)// if condition met
{
//place buy order
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failedreturn(0);
}
// or if conditions for sell metif(bar2<-1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
return(0); //return to start
}
}
return(0);
}
//========================================================================int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
if(OrderType()==OP_SELL || OrderType()==OP_BUY)
count++;
}
return(count);
}
//========================================================================void CloseThisSymbolAll()
{
int trade;
for(trade=OrdersTotal();trade>=0;trade--)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol()) continue;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
}
//Sleep(1000);
}
}
//========================================================================
chuale: Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен.использовать OrderTicket() правильно?
Привет еще раз, Чуале,
Я играл с вашей идеей на USDJPY и не смог добиться положительных результатов без некоторых изменений.Вот пример моих результатов на USDJPY на графике M1:
Вы собирались использовать это на другой паре?
Выход на bar3 < -1 или bar3 > 1 не дал положительных результатов.
ищите правильный символ и правильное магическое число
с помощью цикла ордеров вы можете выбрать правильную сделку для закрытия.
.
с вашим методом
вы теряете стоимость билета в момент перезагрузки компьютера, поэтому
не работает .....
Если вы имеете в виду, что это не лучший способ закрыть ордер, то я согласен, но если парень не хочет использовать OrderSelect (или не знает как) и не оставляет открытых ордеров на рынке, то это работает.
Мы пытаемся помочь друг другу здесь, и ваш ответ ничуть не помог, вы не показали ему, как использовать функцию Order Select, и его советник теперь работает не лучше из-за вашего комментария.
В следующий раз, когда захотите помочь, сделайте это правильно, выложите правильный код, чтобы другие могли чему-то научиться.
Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите входить на новом баре и выходить, если условия выполнены? Вот что я думаю:
Сначала вы подсчитываете заказы с помощью функции OrdersTotal().
Затем вычисляете свои переменные
Если в рынке есть ордера, проверьте, должны ли они быть закрыты.
Если ордеров на рынке нет, проверьте, выполнены ли условия входа.
Привет всем,
Теперь я вставляю билет и лоты в OrderClose без использования OrderTicket() и OrderLots(), но это не закрывает ордер. Пожалуйста, помогите.
Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите, чтобы вход был на новом баре и выход при выполнении условий? Вот что я думаю:
Сначала вы подсчитываете ордера с помощью OrdersTotal().
Затем вычисляете свои переменные
Если в рынке есть ордера, проверьте, должны ли они быть закрыты.
Если ордеров на рынке нет, проверьте, выполнены ли условия входа.
Дайте мне знать, если у вас есть какие-либо вопросы.
билет является локальной переменной, поэтому при следующем тике он не будет иметь то же значение
Поместите за пределы функций, чтобы сделать ее Globalscope
total=OrdersTotal();?????? ..... бесполезно
проверьте правильно, какие сделки у вас есть
ищите правильный символ и правильное магическое число
с помощью цикла ордеров вы можете выбрать правильную сделку для закрытия.
.
с вашим методом
вы теряете стоимость билета в момент перезагрузки компьютера, поэтому
не работает .....
Почему вы процитировали мое сообщение, а затем не добавили комментарий?
да, теперь он может закрыться. спасибо GumRai. теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
Если вы используете OrderTicket(), то просто убедитесь, что вы сначала используете OrderSelect(), а также убедитесь, что это та сделка, которую вы хотите закрыть.
Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
Привет, Чуале,
Вот простой способ выбора ордеров и закрытия ордеров по символу и по номеру Magic:
Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен.использовать OrderTicket() правильно?
Привет еще раз, Чуале,
Я играл с вашей идеей на USDJPY и не смог добиться положительных результатов без некоторых изменений.Вот пример моих результатов на USDJPY на графике M1:
Вы собирались использовать это на другой паре?
Выход на bar3 < -1 или bar3 > 1 не дал положительных результатов.
?????? ..... бесполезно
проверьте правильно, какие сделки у вас есть
ищите правильный символ и правильное магическое число
с помощью цикла ордеров вы можете выбрать правильную сделку для закрытия.
.
с вашим методом
вы теряете стоимость билета в момент перезагрузки компьютера, поэтому
не работает .....
Если вы имеете в виду, что это не лучший способ закрыть ордер, то я согласен, но если парень не хочет использовать OrderSelect (или не знает как) и не оставляет открытых ордеров на рынке, то это работает.
Мы пытаемся помочь друг другу здесь, и ваш ответ ничуть не помог, вы не показали ему, как использовать функцию Order Select, и его советник теперь работает не лучше из-за вашего комментария.
В следующий раз, когда захотите помочь, сделайте это правильно, выложите правильный код, чтобы другие могли чему-то научиться.
Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите входить на новом баре и выходить, если условия выполнены? Вот что я думаю:
Сначала вы подсчитываете заказы с помощью функции OrdersTotal().
Затем вычисляете свои переменные
Если в рынке есть ордера, проверьте, должны ли они быть закрыты.
Если ордеров на рынке нет, проверьте, выполнены ли условия входа.
Дайте мне знать, если у вас есть вопросы.