static datetime bar_time = 0; datetime _time = iTime(_Symbol, PERIOD_CURRENT, 0); if( bar_time == _time ) return; bar_time = _time; /* рабтаем*/
nas3ha:
..... FlagOpnOr = false; // после extern int Magic ... флаг открытия ордеров ..... void OnTick() { if(FlagOpnOr == false) { if(Symbol1!="") { OpenPos(Symbol1); } if(Symbol2!="") { OpenPos(Symbol2); } if(Symbol3!="") { OpenPos(Symbol3); } FlagOpnOr = true; } }
флаги добавьте, изначально флаг открытия ордера ложь. Перед открытием ордеров Если флаг открытия ордера ложь, то открываем ордера, после открытия ордера флаг открытия ордера истина. После закрытия ордера, и это надо отслеживать на каждом тике, флаг открытия ордера опять ложь. Если контроль закрытия не нужен, то можно и не отслеживать закрытие ордеров.
И если честно открытие закрытие удаление ордеров лучше в функциях или классах делать, с проверками на правильность параметров, с проверкой на ошибки, так если открывать и где то будет при открытии ошибка, найти ее будет сложно, или не возможно.
Опять что то не так делаю.
extern string s="Выбор валютной пары"; input double PRICES = 1.1600; extern string Symbol1 = "EURUSD"; extern double P1 = 0; extern int Magic1 = 123; extern double P2 = 0; extern double P3 = 0; extern double P4 = 0; input string COMMENT1 = "test"; extern string Symbol2 = "GBPUSD"; input string COMMENT2 = "test"; extern string Symbol3 = ""; extern string Symbol4 = ""; extern string Symbol5 = ""; extern string Symbol6 = ""; extern string Symbol7 = ""; extern string Symbol8 = ""; extern string Symbol9 = ""; extern string ss="Настройки советника"; extern double Lots1 = 0.01; // LOT extern double Lots2 = 0.1; // LOT extern int TakeProfit = 3333; // TP extern int StopLoss = 3333; // SL extern int Slip = 30; // SLEPE extern int Magic = 123; // MAG int FlagOpnOr = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Comment(PRICES); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(FlagOpnOr == false) { if(Symbol1!="") { OpenPos(Symbol1); } if(Symbol2!="") { OpenPos(Symbol2); } if(Symbol3!="") { OpenPos(Symbol3); } FlagOpnOr = true; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price,string symb) { int r=0,d=0; color clr=Green; double sl=0,tp=0, pp=0; pp= MarketInfo(symb,MODE_POINT); d =(int)MarketInfo(symb,MODE_DIGITS); if(type==1 || type==3 || type==5) { clr=Red; if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*pp,d); if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*pp,d); } if(type==0 || type==2 || type==4) { clr=Blue; if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*pp,d); if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*pp,d); } r=OrderSend(Symbol1,OP_BUY,Lots1,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P1,Slip,sl,tp,COMMENT1,Magic1,0,clr); r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P2,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P3,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol1,OP_BUYSTOP,Lots1,P4,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol2,OP_SELL,Lots2,NormalizeDouble(price,d),Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol2,OP_BUYLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol2,OP_BUYSTOP,Lots2,1.1500,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol2,OP_SELLLIMIT,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr); r=OrderSend(Symbol2,OP_SELLSTOP,Lots2,1.1700,Slip,sl,tp,COMMENT1,Magic,0,clr); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OpenPos(string symb) { double bid=0,ask=0; if(CountTrades(symb)<1) { if(PRICES - Bid < -Point() / 10.0) { bid = MarketInfo(symb,MODE_BID); ask = MarketInfo(symb,MODE_ASK); //buy if(CountTrades(symb)<1) { PutOrder(0,ask,symb); } //sell if(CountTrades(symb)<1) { PutOrder(1,bid,symb); } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountTrades(string symb) { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==symb && OrderMagicNumber()==Magic) { if(OrderType()<2) count++; } } } return(count); }
Открывает только два рыночных ордера и три отложених, к тому же BUYLIMIT выставляется дважды.
Опять что то не так делаю.
Открывает только два рыночных ордера и три отложених, к тому же BUYLIMIT выставляется дважды.
bool FlagOpnOr = false;
Код внимательно не смотрел. А что правильно должен открывать?
И как то уж не по феньшуй сперва считать для или Бай или Селл стоплосс и тейкпрофит, и потом открывать все ордера и Бай и Селл направления. Для Селл стоплосс и тейкпрофит при открытии бай ордеров будет давать ошибку.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Привожу код советника. Он выставляет отложенные ордера при каждом тике, а нужно чтоб выставил бы только один раз. Можете помочь?