Возникла дикая необходимасть открывать позицию в обратную сторону если ордер последний закрылся в убыток.
По сути понимаю что нужно отработка по ордер селект но столкнулсп с тем что не вижу полностью логику для реализации.
В коде есть правильный расчет профита последних закрытых ордеров: https://www.mql5.com/ru/code/17389
Пример для вас:
if (LastProfitCL(1)<0) OrderSend(OP_BUY,-,-,-,-,-,-) //если селл ордер закрылся в убыток, то открываем ордер бай
if (LastProfitCL(0)<0) OrderSend(OP_SELL,-,-,-,-,-,-) //если бай ордер закрылся в убыток, то открываем ордер селл
if (LastProfitCL(-1)<0) //профит любого ордера
В коде есть правильный расчет профита последних закрытых ордеров: https://www.mql5.com/ru/code/17389
Пример для вас:
if (LastProfitCL(0)<0) OrderSend(OP_SELL,-,-,-,-,-,-) //если бай ордер закрылся в убыток, то открываем ордер селл
А можно весь синтаксис выбора?
В смысле сделать за вас?? В коде же есть нужная функция. Копировать - вставить не можете??
В смысле сделать за вас?? В коде же есть нужная функция. Копировать - вставить не можете??
Вот в продолжении.
Ох, ну и ужас в коде!!))
extern int TakeProfit = 100;
extern int LastPriceClosePp = 1000;
//--------------------------------+
int i,send;
double SL,TP;
void start() {
double buy_orders=0, sell_orders=0;
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if(OrderType()==0) {buy_orders++;}
if(OrderType()==1) {sell_orders++;}
}
if(buy_orders==0){
SL = NormalizeDouble(Bid - StopLoss * Point,Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point,Digits);
if(LastProfitCL(1)<0 && MathAbs(Ask-LastCLpriceALL())>=LastPriceClosePp*Point)
send = OrderSend(Symbol(),OP_BUY,BuyVolume,Ask,Slippage,SL,TP,"",Magic,0,clrAzure);
}//Если профит последнего закрытого sell order <0 и рыночная цена >= цены последнего закрытия, то открываем ордер buy
if(sell_orders==0){
SL = NormalizeDouble(Ask + StopLoss * Point,Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point,Digits);
if(LastProfitCL(0)<0 && MathAbs(Bid-LastCLpriceALL())>=LastPriceClosePp*Point)
send = OrderSend(Symbol(),OP_SELL,SellVolume,Bid,Slippage,SL,TP,"",Magic,0,clrAzure);
}//Если профит последнего закрытого buy order <0 и рыночная цена >= цены последнего закрытия, то открываем ордер sell
}//=== StartEND ===//
//--------------------------------------------------------------------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция, 0 buy, 1 sell)
int cnt=0,cntb=0,cnts=0;
datetime t=0,tb=0,ts=0;
double lastprof=0.0,pr=0.0,prb=0.0,prs=0.0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cnt==0 && OrderCloseTime()!=0) t=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<t) break;
if (op<0) pr=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=pr;cnt++;
}
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()!=0||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cntb==0 && OrderCloseTime()!=0) tb=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<tb) break;
if (OrderType()==op) prb=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prb;cntb++;
}
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()!=1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cnts==0 && OrderCloseTime()!=0) ts=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<ts) break;
if (OrderType()==op) prs=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prs;cnts++;
}
return(lastprof);
}
//+---------------------------------------------------------------+
//| Возвращает цену последнего закрытого ордера |
//+---------------------------------------------------------------+
double LastCLpriceALL() {
datetime TimeCL=0;
double CLprice=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(TimeCL<OrderCloseTime()) {TimeCL=OrderCloseTime();CLprice=OrderClosePrice();}
}
return (CLprice);
}
Ох, ну и ужас в коде!!))
extern int StopLoss = 100;
extern int TakeProfit = 100;
extern int Magic = 777;
//-----------------------+
int i,send;
double SL,TP;
void start() {
double buy_orders=0, sell_orders=0;
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if(OrderType()==0) {buy_orders++;}
if(OrderType()==1) {sell_orders++;}
}
if(buy_orders==0) {
SL = NormalizeDouble(Bid - StopLoss * Point,Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point,Digits);
if(LastProfitCL(1)<0) send=OrderSend(Symbol(),OP_BUY,BuyVolume,Ask,Slippage,SL,TP,"",Magic,0,clrAzure);
}
if(sell_orders==0) {
SL = NormalizeDouble(Ask + StopLoss * Point,Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point,Digits);
if(LastProfitCL(0)<0) send=OrderSend(Symbol(),OP_SELL,SellVolume,Bid,Slippage,SL,TP,"",Magic,0,clrAzure);
}
}//=== StartEND ===//
//--------------------------------------------------------------------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция, 0 buy, 1 sell)
int cnt=0,cntb=0,cnts=0;
datetime t=0,tb=0,ts=0;
double lastprof=0.0,pr=0.0,prb=0.0,prs=0.0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cnt==0 && OrderCloseTime()!=0) t=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<t) break;
if (op<0) pr=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=pr;cnt++;
}
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()!=0||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cntb==0 && OrderCloseTime()!=0) tb=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<tb) break;
if (OrderType()==op) prb=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prb;cntb++;
}
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()!=1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(cnts==0 && OrderCloseTime()!=0) ts=OrderCloseTime();
if(OrderCloseTime()+PeriodSeconds()<ts) break;
if (OrderType()==op) prs=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prs;cnts++;
}
return(lastprof);
}
//+---------------------------------------------------------------+
//| Возвращает цену последнего закрытого ордера |//+---------------------------------------------------------------+
double LastCLpriceALL() {
datetime TimeCL=0;
double CLprice=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
if(TimeCL<OrderCloseTime()) {TimeCL=OrderCloseTime();CLprice=OrderClosePrice();}
}
return (CLprice);
}
Наталья, к чему столько циклов в коде
можно одним обойтись
Наталья, к чему столько циклов в коде
можно одним обойтись
Если вы про функцию профита закрытых ордеров, то нельзя одним обойтись, т.к. подсчет становится бредовым, уже проверено
P.S. у меня код исправлен поправьте и у себя в предыдущем ответе
Если вы про функцию профита закрытых ордеров, то нельзя одним обойтись, т.к. подсчет становится бредовым, уже проверено
P.S. у меня код исправлен поправьте и у себя в предыдущем ответе
Пример, класика
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
MessageBox("\n" +
"Профит по всем позициям = " + DoubleToString(GetProfitCurrency(),2)+" USD"+"\n" +
"Профит по текущему символу = " + DoubleToString(GetProfitCurrency(Symbol()),2)+" USD"+"\n" +
"Профит по текущему символу, покупки = " + DoubleToString(GetProfitCurrency(Symbol(),OP_BUY),2)+" USD"+"\n" +
"Профит по текущему символу, продажи = " + DoubleToString(GetProfitCurrency(Symbol(),OP_SELL),2)+" USD"+"\n" +
"Профит по текущему символу, с магиком = " + DoubleToString(GetProfitCurrency(Symbol(),-1,100),2)+" USD"
,"ИСТОРИЯ",MB_OKCANCEL);
}
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает суммарный профит в валюте депозита |
//|
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
double GetProfitCurrency(string sy="", int op=-1, int mn=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
return(p);
}
... если ордер последний закрылся в убыток.
Хватит дурачить человека. Он же спросил про последний ордер
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем ассам привет.
Возникла дикая необходимасть открывать позицию в обратную сторону если ордер последний закрылся в убыток.
По сути понимаю что нужно отработка по ордер селект но столкнулсп с тем что не вижу полностью логику для реализации.
ППодсказите с решением....