Думал делать так, но нихера не получилось...
if (Ask > OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES)+ 100*Point )//Перевод в Безубыток { bool slb1 = OrderModify (ticket1, OrderOpenPrice(), Ask-50*Point, OrderTakeProfit(), 0,Red ); }
В общем рак в программировании)
Надеюсь на вашу помощь)
Думал делать так, но нихера не получилось...
if (Ask > OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES)+ 100*Point )//Перевод в Безубыток { bool slb1 = OrderModify (ticket1, OrderOpenPrice(), Ask-50*Point, OrderTakeProfit(), 0,Red ); }
В общем рак в программировании)
Надеюсь на вашу помощь)
Сударь, дык OrderSelect же возвращает только булево значение при выборе ордера. Зачем вы сравниваете его с ценой ?
Лучше уж так хоть:
if (OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES)) { if (Ask - OrderOpenPrice() > 100*Point) { bool slb1 = OrderModify (ticket1, OrderOpenPrice(), OrderOpenPrice()+50*Point, OrderTakeProfit(), 0,Red ); } }P.S.
Вообще, я бы еще перенес проверку в отдельный блок и через OrderType() менял условия проверки в зависимости от типа ордера (если у вас, конечно, ордеры в обе стороны открываются).
//Получаем тикет ордера для Без убытка
OrderSelect(OrderTicket,SELECT_BY_POS,MODE_TRADES); { //Проверили профит по ордеру больше нуля или нет, можно не проверять. if (OrderProfit()>0) { //Узнали тип ордера покупка или продажа if (OrderType()==OP_SELL) { double CurrentPoint = (OrderOpenPrice()-Ask)/(_Point); if (CurrentPoint>=1000) { //Тянем SL в БУ + 50 пунктов по 5 знаку OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-500*Point,OrderTakeProfit(),0,clrWhite); } } if (OrderType()==OP_BUY) { double CurrentPoint = (Bid-OrderOpenPrice())/(_Point); if (CurrentPoint>=1000) { //Тянем SL в БУ + 50 пунктов по 5 знаку OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+500*Point,OrderTakeProfit(),0,clrWhite); } } }
Всем привет, в первые пишу на этом форуме, надеюсь найдутся желающие помочь)
Написал советник, но нужно, чтобы после прохождения цены от точки входа на 100 пунктов, робот ставил безубыток 50 пунктов в плюс от точки входа (и не менялся).
Получив 100 пунктов прибыли, надо сразу закрывать... Зачем же ждать, когда останется 50 ?
Получив 100 пунктов прибыли, надо сразу закрывать... Зачем же ждать, когда останется 50 ?
100 пунктов по 5му знаку имел в виду. Это мало
100 пунктов по 5му знаку имел в виду. Это мало
Ребята подскажите пож. как записать в коде советника чтобы при едино разовом выполнении условия советник открывал 3 сделки сразу с возможностью установки LS?
Вот моё условие
if(MA_1>MA_2) ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen); if(MA_1<MA_2) ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так
void OnTick() { //--- double MA_1; MA_1=iMA(_Symbol,0,1,0,1,0,0); double MA_2; MA_2=iMA(_Symbol,0,6,0,1,0,0); int ticket=0; if(OrdersTotal()<=3) { if(MA_1>MA_2) ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen); if(MA_1<MA_2) ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed); } //--- } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- }
Компилируется ошибок нет но это не для моего случая данная функция.
Ребята подскажите пож. как записать в коде советника чтобы при едино разовом выполнении условия советник открывал 3 сделки сразу с возможностью установки LS?
Вот моё условие
Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так
Компилируется ошибок нет но это не для моего случая данная функция.
попробуй просто так вставить:
if (OrdersTotal()>= 3) // Если общее количество ордеров больше 3х { return; //задача закрывается }
попробуй просто так вставить:
Если я открываю позицию после выполнения условия
if(MA_1>MA_2) ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen); if(MA_1<MA_2) ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
Это означает что во-первых после выполнения условия в реальном времени советник открывает сделки т. е. бесконечно поэтому я задал вопрос "при едино разовом выполнении условия советник открывал 3 сделки"
во-вторых если и будет открыто 3 сделки сразу то также будут выставлены стоп ордера а это означает наличие 6 ордеров в реальном времени поэтому к функции OrdersTotal должно что-то быть ещё так как она просто учитывает ордера. У меня есть этот код но мне немного не понятно.
Можете объяснить формулировку кода?
#property copyright "Влад Сергеев для mmgp" #property version "1.00" #property strict #property script_show_inputs input int orders = 4; //всего ордеров в серии input bool buy = true; //флаг разрешающий/запрещающий покупки input bool sell = false; //флаг разрешающий/запрещающий продажи input int magic = 100500; //уникальный номер для ордеров, открываемых этим скриптом input double lot = 0.01; //объем каждого ордера серии input int tp = 100; //тейк профит, в пунктах input int sl = 100; //стоп лосс, в пунктах input int slip = 2; //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart() { int i=0; // для чего эта переменная int ticket=0; if(buy) { while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего { RefreshRates(); // если убрать эту функцию коду хуже не становится ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно if(ticket!=-1) // эта строчка тоже не понятна { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) // функция для выбора ордера это логично но тоже не понятно как ей пользоваться { OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue); // эту строчку тоже хотел бы чтобы объяснили } } i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера } } i=0; if(sell) // прошлая запись была для покупак эта для продаж { while(i<orders) { RefreshRates(); ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed); if(ticket!=-1) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed); } } i++; } } }
Если я открываю позицию после выполнения условия
Это означает что во-первых после выполнения условия в реальном времени советник открывает сделки т. е. бесконечно поэтому я задал вопрос "при едино разовом выполнении условия советник открывал 3 сделки"
во-вторых если и будет открыто 3 сделки сразу то также будут выставлены стоп ордера а это означает наличие 6 ордеров в реальном времени поэтому к функции OrdersTotal должно что-то быть ещё так как она просто учитывает ордера. У меня есть этот код но мне немного не понятно.
Можете объяснить формулировку кода?
#property copyright "Влад Сергеев для mmgp" #property version "1.00" #property strict #property script_show_inputs input int orders = 4; //всего ордеров в серии input bool buy = true; //флаг разрешающий/запрещающий покупки input bool sell = false; //флаг разрешающий/запрещающий продажи input int magic = 100500; //уникальный номер для ордеров, открываемых этим скриптом input double lot = 0.01; //объем каждого ордера серии input int tp = 100; //тейк профит, в пунктах input int sl = 100; //стоп лосс, в пунктах input int slip = 2; //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnStart() { int i=0; //эта переменная будет считать кол-во открываемых позиций int ticket=0; if(buy) //если покупки разрешены { while(i<orders) // ордера buy будут открываться до количества равного orders { RefreshRates(); // Эта функция используется, когда эксперт или скрипт производит вычисления в течение долгого времени и нуждается в обновленных данных. ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //запоминаем номер тикета открывшегося ордера if(ticket!=-1) // если ордер на покупку открылся(если -1 тогда не открылся) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) // если только что открытый ордер выбрался для дальнейшей работы с ним { OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue); // модифицируется только что открытый ордер(установка стоплосса и тейкпрофита) } } i++; // +один ордер идём наверх и проверяем условие i<orders } } i=0;//обнуляем счётчик и делаем всё как и с buy if(sell) // { while(i<orders) { RefreshRates(); ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed); if(ticket!=-1) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed); } } i++; } } }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет, в первые пишу на этом форуме, надеюсь найдутся желающие помочь)
Написал советник, но нужно, чтобы после прохождения цены от точки входа на 100 пунктов, робот ставил безубыток 50 пунктов в плюс от точки входа (и не менялся).
Вот сам код: