-----------------------------------------------------------------+ //| Opening and Closeing.mq4 | //| Copyright © 2010, Ben banta | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ben banta" //+------------------------------------------------------+ //| Closing My Way | //+------------------------------------------------------+ double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if ( OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol() // with my symbol ) { if(OrderType() == OP_SELL) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() + (ATR*2)) // ATR*2 above Sell. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Blue); Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2)) //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2)) }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc }// END for loop //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0) return(0); }//ENDif (Ask > High[iHighest(NU... etc //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); }//ENDif (ticket>0) else Print ("Error Opening Sell Order :" ,GetLastError()); //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(0); }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) return(0); }//ENDif (OrdersTotal() < 1) }//ENDint start()Это должно облегчить чтение блоков кода
if(OrderTicket() == OrderOpenPrice() - (ATR*2))Order ticket - очень большое целое число (возможно, в миллиардах), ключ к заказу.
OOP - 2ATR - это цена.
Эти два показателя НИКОГДА не будут равны
если вы имели в виду OrderClosePrice() == OOP-2ATR реальные числа почти никогда не будут равны. используйте вместо этого:
if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...
OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()Ваш OrderSend не устанавливает магическое число
Order ticket - очень большое целое число (возможно, в миллиардах), ключ к заказу.
OOP - 2ATR - это цена.
Эти два показателя НИКОГДА не будут равны
если вы имели в виду OrderClosePrice() == OOP-2ATR реальные числа почти никогда не будут равны. используйте вместо этого:
Ваш OrderSend не устанавливает магическое число
Спасибо, что заглянули и дали рекомендации. Но должен сказать, что я не сразу понял OOP -2ATR.
OOP = OrderOpenPrice. Сначала это прошло мимо моей головы. Ваше объяснение абсолютно верно. Я зацепился за знак ==. OrderClosePrice() может никогда не равняться OrderOpenPrice() минус (ATR*2). Спасибо, что обратили на это внимание.
Позвольте мне проверить, правильно ли я понял ваше предложение. Я переформулирую его здесь. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Это выглядит так (здесь я буду использовать произвольные цифры) OCP = 1.4361, OOP = 1.4321, ATR = 20. Таким образом, выражение будет выглядеть следующим образом:
if (1.4321 - 1.4361 - (20*2) <= 0), Извините, но я не понимаю.
Может быть, я могу использовать те же цифры для перестановки выражения, чтобы показать, что я имел в виду. Но и это не сработало, когда я ввел их в программу.
Новая схема выглядит следующим образом.
if (1.4361 >= 1.4321 + (20*2)).
Если OCP >=OOP + ATR*2, управление переходит к:
OrderClose (OrderTicket(), OrderLots() и т.д.
Другое ваше замечание заключалось в том, что OrderSend не устанавливает магическое число.
Могу ли я просто убрать эту часть из программы: && OrderMagicNumber == MagicNumber,
Еще раз спасибо, и если вы можете увидеть другие улучшения, я буду очень признателен.
Будь здоров
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
Спасибо за ваш ответ. Надеюсь, у вас все хорошо.
Предложение было вставлено сегодня утром. К сожалению, компилятору не нравится то, что я закодировал. Я не уверен, какое утверждение в программе является неправильным. Я считаю, что все предложения в порядке. Я повторно размещу программу и отмечу область, которая, по моему мнению, может быть проблемой. Я также изложу стратегию закрытия.
Позиция на продажу будет остановлена выше цены открытия ордера на Atr*2. Например, OOP = 1.4321, Atr =20, и OCP = 1.4361.
Поэтому я закодировал выражение следующим образом,
if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // условие выполнено, управление переходит на....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;
Примечание: В операторе OrderSend нет ни StopLoss(), ни TakeProfit(), если это имеет какое-то значение.
Еще раз спасибо за помощь
Спасибо
double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if (OrderSelect(index, SELECT_BY_TICKET) // existing orders //&& OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()) // with my symbol { if(OrderType() == OP_SELL) order = OrderTicket(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met, // control then passes to... { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); } } } //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); return(0); } //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Sell Order :" ,GetLastError()); return(0); } return(0); } }
Привет, Гекльберри,
Я собираюсь немного переделать вашу программу.
Пока
Зачем делать "order = OrderTicket(); " и не использовать это значение в функции orderclose()?
Хотя вероятность того, что выбранный ордер изменился, не будет ли безопаснее использовать положительно идентифицированное значение ордера?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() будет текущим выбранным билетом - на данном этапе моего обучения
Я не могу сказать, какой билет выбран, когда вы делаете OrderClose().
//// Редактировать
На самом деле я не уверен, что "order= OrderTicket()" - это тот билет, который вы определили в предыдущем выражении If.
Зачем делать "order = OrderTicket(); " и не использовать это значение в функции orderclose()?
Хотя вероятность того, что выбранный ордер изменился, не будет ли безопаснее использовать положительно идентифицированное значение ордера?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() будет текущим выбранным билетом - на данном этапе моего обучения
Я не могу сказать, какой билет выбран, когда вы делаете OrderClose().
//// Редактировать
На самом деле я не уверен, что "order= OrderTicket()" - это тот билет, который вы определили в предыдущем выражении If.
Спасибо за ваше наблюдение и предложение. Ваше время очень ценно.
Ваши рассуждения имеют смысл. Я не более уверен, чем вы, в том, что касается выбранного порядка. Я попробую воспользоваться вашим предложением.
Еще раз спасибо.
Спасибо

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет всем
Надеюсь, что синтаксис стал лучше, чем раньше. В течение последней недели я читаю Codersguru.
Программа ниже, хотя и не имеет ошибок, компилятор регистрирует только один порядок. Но мой код не закрывает его.
Программа утверждает --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), я
я не вставил стоплосс или тейкпрофит, как вы можете видеть. Причина, есть условие StopLoss уже закодированное как таковое ---.
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Таким образом, нет необходимости вставлять еще один StopLoss, не так ли? Что касается TakeProfit
Я вставлю его, когда будет решена другая проблема.
Дело в том, как я закодировал условие закрытия, или опять проблемы с синтаксисом?
Спасибо всем за помощь, и пусть моя проблема поможет другим,
Спасибо