extern double Lots = 0.1; extern double TrailingStop = 25; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2; double P_up0,P_down0,P_up1,P_down1; int cnt,ticket,total; if(Bars<100) { Print("bars less than 100"); return(0); } P_up0=iCustom(0,0,"Ценовой канал",5,0,0); P_down0=iCustom(0,0,"Ценовой канал",5,1,0); P_up1=iCustom(0,0,"Ценовой канал",5,0,1); P_down1=iCustom(0,0,"Ценовой канал",5,1,1); ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1); ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1); ao1=iAO(0,0,1); ao2=iAO(0,0,2); ac1=iAC(0,0,1); ac2=iAC(0,0,2); //задали все данные total=OrdersTotal(); if(total<1) { // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Условие открытие позиции SELL if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) // длинная позиция открыта { // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop && Bid-OrderOpenPrice() <= 5*Point) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop) && (OrderOpenPrice()-Ask) <= 5*Point) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); }Вроде бы так...
Ничего не выходит! Непроисходит ни какой модификации ордеров!
Цель модификации ордера: создать минимальный плюс по пунктам, но при этом далее модификация не должна происходить. Закрытие должно происходить по индикатору. Но если цена достигла +5 пунктов, а потом вернулась, то на этих 5 пунктах позиция и должна закрыться!
Получается, что 1) не должно быть трелинг стопа (т. к. это подразумевает дальнейшее движение ордара),2) модификация должна состоять из спреда (у всех пар разного, а поэтому его можно вынести в начальные настройки) и еще 5 пунктов. модификация произошла и далее ордер остается на этой цене пока не закроется по индикатору, либо цена не вернется обратно.
Ничего не выходит! Непроисходит ни какой модификации ордеров!
Цель модификации ордера: создать минимальный плюс по пунктам, но при этом далее модификация не должна происходить. Закрытие должно происходить по индикатору. Но если цена достигла +5 пунктов, а потом вернулась, то на этих 5 пунктах позиция и должна закрыться!
Получается, что 1) не должно быть трелинг стопа (т. к. это подразумевает дальнейшее движение ордара),2) модификация должна состоять из спреда (у всех пар разного, а поэтому его можно вынести в начальные настройки) и еще 5 пунктов. модификация произошла и далее ордер остается на этой цене пока не закроется по индикатору, либо цена не вернется обратно.
А можно индикаторы использованные в эксперте?
а спрэд можно узнать так (Ask-Bid). или MarketInfo(Symbol(),MODE_SPREAD)
попробовал подругому, убрал трейлинг стоп. сделал фиксированным ордер.
результат не очень: не отмечает необходимый уровень модификационного ордера 8 (спред) + 5.
посмотрите как можно задать этот уровень????!!!
ценовой индикатор вот!
extern double Lots = 0.1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2; double P_up0,P_down0,P_up1,P_down1; int cnt,ticket,total; if(Bars<100) { Print("bars less than 100"); return(0); } P_up0=iCustom(0,0,"Ценовой канал",5,0,0); P_down0=iCustom(0,0,"Ценовой канал",5,1,0); P_up1=iCustom(0,0,"Ценовой канал",5,0,1); P_down1=iCustom(0,0,"Ценовой канал",5,1,1); ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1); ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1); ao1=iAO(0,0,1); ao2=iAO(0,0,2); ac1=iAC(0,0,1); ac2=iAC(0,0,2); //задали все данные total=OrdersTotal(); if(total<1) { // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Условие открытие позиции SELL if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) // длинная позиция открыта { // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } if(Bid-OrderOpenPrice()>Point*13) { if(OrderStopLoss()<Bid-Point*13) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } if((OrderOpenPrice()-Ask)>(Point*13)) { if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } return(0); }
попробовал написать так образом но советник начинает модифицировать ордера до талого, а надо только до определенного уровня. как сделать??????????????? знатоки програмирования, если такие есть помогите!
extern double Lots = 0.1; extern double TrailingStop = 25; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2; double P_up0,P_down0,P_up1,P_down1; int cnt,ticket,total; if(Bars<100) { Print("bars less than 100"); return(0); } P_up0=iCustom(0,0,"Ценовой канал",10,0,0); P_down0=iCustom(0,0,"Ценовой канал",10,1,0); P_up1=iCustom(0,0,"Ценовой канал",10,0,1); P_down1=iCustom(0,0,"Ценовой канал",10,1,1); ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1); ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1); ao1=iAO(0,0,1); ao2=iAO(0,0,2); ac1=iAC(0,0,1); ac2=iAC(0,0,2); //задали все данные total=OrdersTotal(); if(total<1) { // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Условие открытие позиции SELL if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) // длинная позиция открыта { // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } if(Bid-OrderOpenPrice()>Point*13) { if(OrderStopLoss()<Bid-Point*13) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green); return(0); } } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } if((OrderOpenPrice()-Ask)>(Point*13)) { if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red); return(0); } } } } } return(0); }
Такой вариант подойдет?
extern double SetMinProfitLevelPts = 25; //мин.прибыль устанавливается только при достижении данного уровня extern double MinProfitPts = 5; //мин.прибыль в пунктах, 0 - для безубытка
//вызывать эту функцию в start() для каждого открытого ордера, //перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect int CheckNeedSetMinProfit() { if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется if (OrderType() > 1) return(-1); //отложенник if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts); double NewStopPrice = OrderOpenPrice(); if (OrderType()==OP_BUY) { NewStopPrice += MinProfitPriceD; if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе } else if (OrderType()==OP_SELL) { NewStopPrice -= MinProfitPriceD; if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе } NewStopPrice = NormalizeDouble(NewStopPrice, Digits); bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0); if (res) {return(0);} else {return(GetLastError());} }
int By(int _By=0)//переводит в безубыток если _By=0, или нужное колво пунктов трала { double sl; int err; double Diap = _By+(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)); for(int i=0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if(OrderSymbol()==Symbol()){ if(OrderProfit()>=Diap){ if(OrderType()==OP_BUY){ sl=NormalizeDouble((OrderOpenPrice()+(_By*Point)),Digits); if(OrderStopLoss()!=_By){err=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);}} if(OrderType()==OP_SELL){ sl=NormalizeDouble((OrderOpenPrice()-(_By*Point)),Digits); if(OrderStopLoss()!=_By){err=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);}} } } } } return(err); }
Такой вариант подойдет?
Не получается вставить. ошибки выдает. програмист очень слабый из меня. в основном занимаюсь компиляцией. покажите как надо вставить.
extern double Lots = 0.1; extern double SetMinProfitLevelPts = 25; //мин.прибыль устанавливается только при достижении данного уровня extern double MinProfitPts = 5; //мин.прибыль в пунктах, 0 - для безубытка //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2; double P_up0,P_down0,P_up1,P_down1; int cnt,ticket,total; if(Bars<100) { Print("bars less than 100"); return(0); } P_up0=iCustom(0,0,"Ценовой канал",10,0,0); P_down0=iCustom(0,0,"Ценовой канал",10,1,0); P_up1=iCustom(0,0,"Ценовой канал",10,0,1); P_down1=iCustom(0,0,"Ценовой канал",10,1,1); ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1); ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1); ao1=iAO(0,0,1); ao2=iAO(0,0,2); ac1=iAC(0,0,1); ac2=iAC(0,0,2); //задали все данные //вызывать эту функцию в start() для каждого открытого ордера, //перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect int CheckNeedSetMinProfit() { if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется if (OrderType() > 1) return(-1); //отложенник if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts); double NewStopPrice = OrderOpenPrice(); if (OrderType()==OP_BUY) { NewStopPrice += MinProfitPriceD; if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе } else if (OrderType()==OP_SELL) { NewStopPrice -= MinProfitPriceD; if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе } NewStopPrice = NormalizeDouble(NewStopPrice, Digits); bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0); if (res) {return(0);} else {return(GetLastError());} } total=OrdersTotal(); if(total<1) { // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Условие открытие позиции SELL if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) // длинная позиция открыта { // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } if(Bid-OrderOpenPrice()>Point*13) { if(OrderStopLoss()<Bid-Point*13) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green); return(0); } } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } if((OrderOpenPrice()-Ask)>(Point*13)) { if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red); return(0); } } } } } return(0); }
Такой вариант подойдет?
Не получается вставить. ошибки выдает. програмист очень слабый из меня. в основном занимаюсь компиляцией. покажите как надо вставить.
extern double Lots = 0.1; extern double SetMinProfitLevelPts = 25; //мин.прибыль устанавливается только при достижении данного уровня extern double MinProfitPts = 5; //мин.прибыль в пунктах, 0 - для безубытка //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2; double P_up0,P_down0,P_up1,P_down1; int cnt,ticket,total; if(Bars<100) { Print("bars less than 100"); return(0); } P_up0=iCustom(0,0,"Ценовой канал",10,0,0); P_down0=iCustom(0,0,"Ценовой канал",10,1,0); P_up1=iCustom(0,0,"Ценовой канал",10,0,1); P_down1=iCustom(0,0,"Ценовой канал",10,1,1); ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1); ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1); ao1=iAO(0,0,1); ao2=iAO(0,0,2); ac1=iAC(0,0,1); ac2=iAC(0,0,2); //задали все данные //вызывать эту функцию в start() для каждого открытого ордера, //перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect int CheckNeedSetMinProfit() { if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется if (OrderType() > 1) return(-1); //отложенник if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts); double NewStopPrice = OrderOpenPrice(); if (OrderType()==OP_BUY) { NewStopPrice += MinProfitPriceD; if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе } else if (OrderType()==OP_SELL) { NewStopPrice -= MinProfitPriceD; if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе } NewStopPrice = NormalizeDouble(NewStopPrice, Digits); bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0); if (res) {return(0);} else {return(GetLastError());} } total=OrdersTotal(); if(total<1) { // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Условие открытие позиции SELL if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) // длинная позиция открыта { // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } if(Bid-OrderOpenPrice()>Point*13) { if(OrderStopLoss()<Bid-Point*13) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green); return(0); } } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } if((OrderOpenPrice()-Ask)>(Point*13)) { if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red); return(0); } } } } } return(0); }
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите пожалуйста. Скомпоновал простой советник с использованием трейлинг-стопом.
Как сделать так, чтобы трейлинг стоп ставился один раз +5 пунктов и далее не переносился, закрытие происходило
заложенным индикаторам? Если можно на примере!!!