rimm2 Опубликовано 21 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2016 Для покупных ордеров:условие if (BuyLimitCount() == 0 && BuyCount() ==0) Проверки://+------------------------------------------------------------------+int BuyLimitCount(){ int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT) { count++; } } return (count);}//+------------------------------------------------------------------+int BuyCount(){ int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { count++; } } return (count);}//+------------------------------------------------------------------+ И для продажУловие:if (SellLimitCount() == 0 && SellCount() == 0) Проверки://+------------------------------------------------------------------+int SellLimitCount(){ int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT) { count++; } } return (count);}//+------------------------------------------------------------------+int SellCount(){ int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { count++; } } return (count);}//+------------------------------------------------------------------+ Я попробовал всё это заменить одним условием : if (OrdersTotal() Да, согласен это может пригодиться в таких случаях когда один из ордеров не сможет открыться, и в этом случае откроется второй уже дублирующийся ордер. Надобность этих больших проверок только в этом?Добавлено: 21-09-2016 09:42:37А сдесь, почему в условии сравнивается с "-1"?ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, 3, sl, tp, "", Magic, 0, Blue); if (ticket Print ("Не открылась покупка"); Я так понимаю что операция "OrderSend" при неудачи возвращает в "ticket" -1, а при успехе 1, правилино я думаю?это любое действие так делает, любая операция?Извиняюсь если не понятно спросил. Изменено 21 сентября, 2016 пользователем rimm2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
010010111 Опубликовано 21 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2016 FxVooDoo SupplementСоветник выставляет отложенные лимит-ордера на расстоянии N пунктов от точки входа вашего основного советника (по сути любого) и позволяет получить прибыль даже в тех случаях, когда позиция советника уходит в минус, а потом возвращается в плюс.Можно использовать, если у вас в наличии имеется советник, который торгует в плюс, но его позиции часто уходят в минус, перед тем как закрыться с прибылью.Допустим, какой-то ваш советник открыл позицию на продажу в точке X c тейк-профитом 70 пунктов.«»В точке Z тейк-профит сработал, однако перед этим цена добиралась до точки Y и наш ордер уходил в минус на целых 87 пунктов. Вспомогательный эксперт Supplement мог выставить отложенный ордер Sell Limit на этом же расстоянии от нашей точки входа и мы могли бы получить дополнительные 150 пунктов прибыли.Если позиция главного (нашего) советника сразу идет в плюс, и цена не доходит до отложенных ордеров, выставленных Supplement, то все отложки удаляются при достижении тейк-профита. Supplement позволяет выставлять до трех отложенных ордеров на разных расстояниях от точки входа в позицию.Описание настроек FxVooDoo SupplementVoodoo_MagicNumber — мэджик (идентификатор) советника, позиции которого Supplement будет усреднять.RiskPercentage — если все позиции, открытые и основным экспертом и Supplement в сумме достигнут этого уровня убытка (в процентах), то все позиции будут закрыты. По умолчанию стоит 100% — т.е. эта опция не задействована.TotalPositions — сколько отложенных ордеров задействовать в работе Supplement.Далее идет описание параметров для первого отложенного ордера Supplement, точно такие же настройки присутствуют и для 2-го и 3-го ордеровLots1 — размер лота для первого отложенного ордера SupplementDistance1 — расстояние (в пунктах) от позиции нашего советника, на котором Supplement выставит первый отложенный ордерTP1 — тейк-профит отложенного ордераSL1 — стоп-лосс ордераTrailingSL1 — вклвыкл тралл для первой отложки.BEP1 — сколько пунктов прибавлять к цене открытия при переводе позиции в безубытокPips_forBEP_setup1 — уровень прибыли ордера (в пунктах) для его перевода в безубыток.MagicNumber1 — мэджик для первого отложенного ордера. Нужен, чтобы наш главный советник не трогал ордера Supplement.Comments — комментарий к отложенным ордерам. Может быть любым.Данный советник мне почти идеально подходит но согласно моей стратегии у меня всегда ордера на покупку, соответственно для хеджа позиций мне нужно чтобы FxVooDoo Supplement выставлял отложенные ордера SELLSTOP, вместо них он выставляет BUYLIMIT Добавлено: 21-09-2016 12:06:13 Поменял строки кода с 205 по 220 строку на следующий код В итоге он начал правильно выставлять ордера SELLSTOP но не тралит их, а множит без конца if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green); if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red); } if (TotalPositions == 2) { if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green); if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red); if (gi_320 >= 1 && gi_336 + gi_360 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots2, NormalizeDouble(Ask, Digits) - Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Green); if (gi_324 >= 1 && gi_340 + gi_364 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots2, NormalizeDouble(Bid, Digits) + Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Red); } if (TotalPositions >= 3) { if (gi_320 >= 1 && gi_328 + gi_352 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots1, NormalizeDouble(Ask, Digits) - Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Green); if (gi_324 >= 1 && gi_332 + gi_356 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots1, NormalizeDouble(Bid, Digits) + Distance1 * gd_260, gd_268, 0, 0, Comments, MagicNumber1, 0, Red); if (gi_320 >= 1 && gi_336 + gi_360 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots2, NormalizeDouble(Ask, Digits) - Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Green); if (gi_324 >= 1 && gi_340 + gi_364 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots2, NormalizeDouble(Bid, Digits) + Distance2 * gd_260, gd_268, 0, 0, Comments, MagicNumber2, 0, Red); if (gi_320 >= 1 && gi_344 + gi_368 == 0 && gi_312 == TRUE) OrderSend(Symbol(), OP_SELLSTOP, Lots3, NormalizeDouble(Ask, Digits) - Distance3 * gd_260, gd_268, 0, 0, Comments, MagicNumber3, 0, Green); if (gi_324 >= 1 && gi_348 + gi_372 == 0 && gi_316 == TRUE) OrderSend(Symbol(), OP_BUYSTOP, Lots3, NormalizeDouble(Bid, Digits) + Distance3 * gd_260, gd_268, 0, 0, Comments, MagicNumber3, 0, Red);FxVoodoo-supplement-1.mq4 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
iPerevalov Опубликовано 21 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 сентября, 2016 Надобность этих больших проверок заключается в отыскании из всего количества ордеров (будь то лимитных или рыночных) именно тех, которые открыл конкретный советник. Ведь помимо ордеров советника вы можете непосредственно торговать в ручную или сторонний советник торгует непосредственно сам. И чтобы хоть как-то разграничить эти ордера и требуются проверки.Функция OrderSend() "возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи". Таким образом, если ордер не открылся, то функция вернёт -1, а если открылся, то какое-то целое число, необязательно 1.Я тоже только-только учусь. Лично мне помогает (как советовали в этой же ветки некоторые форумчане) использовать функции Print() или Comment() в те или иные моменты, чтобы убедиться самостоятельно в значениях тех или иных функций и разобраться таким образом с ними. Ещё на ранних стадиях очень рекомендуется использовать функцию GetLastError(). 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
SilverKZ Опубликовано 22 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2016 Добрый день!Необходимо поправить функции f0_0(), f0_2() и f0_3().OP_BUYLIMIT => OP_BUYSTOPOP_SELLLIMIT => OP_SELLSTOP 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
rimm2 Опубликовано 22 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2016 Большое спасибо. Всё понятно. Ссылка на сообщение Поделиться на другие сайты More sharing options...
010010111 Опубликовано 22 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 сентября, 2016 Вот бы еще хорошо было если бы он после себя неиспользуемые ордера закрывал, в случае если основная сова отработала без косяков. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Елена4 Опубликовано 25 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 сентября, 2016 Добрый вечер уважаемые программисты нужен советник со следующими торговыми условиями В настройках указываем:1. Время формирования коробки.2. Значения уровней Фибоначчи.3. Объем первой сделки.После формирования коробки советник выставляет два стоп-ордера одинакового объема на максимуме и минимуме коробки с учетом спрэда + 1 пункт. Далее допустим открылся ордер бай(например 0.01). В этот момент необходимо удалить сэлл-стоп и выставить новый сэлл-стоп с объемом в три раза больше (если бай был 0.01, то сэлл-стоп должен быть 0.03). Когда в рынок входит ордер сэлл, необходимо выставить бай-стоп, объем увеличивается уже в два раза от противоположного последнего открытого ордера.(т.е. 0.06, 0.12, 0.24, и т.д.). Тейк профит для всех открытых ордеров выставляем на уровнях Фибоначчи. Стоп лосс для всех открытых ордеров ставим на уровне тейк профит +/- спрэд.(Таким образом все ордера закроются в один момент). Допустим у нас в рынке несколько ордеров, суммарный тейк профит на первом уровне Фибоначчи становится меньше 10 пунктов значит тейк профит и стоп лосс переносим на следующий уровень Фибоначчи (профита). Всем спасибо. ScreenShot1.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
boovood Опубликовано 26 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 сентября, 2016 Глубоко уважаемые знатоки, возникла проблема при написании индикатора.По заданию индикатор должен рисовать вертикальные линии, но он нарисует одну линию и больше не рисует хотя в журнале индикатор работает и должен выставлять ещё линии, что делать? помогите кто знает как правильно написать(желательно исправьте что не правильно и добавьте пояснения как что должно быть, если не затруднит) //+------------------------------------------------------------------+//| 1.mq4 |//| Copyright 2016 |//| https://www. |//+------------------------------------------------------------------+#property copyright "Copyright 2016"#property link "https://www."#property version "1.00"#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+extern double b=98; // верхняя границаextern double c=2; // нижняя граница double a; int d=0; string obj_name="0"; long current_chart_id=ChartID(); datetime time;int OnStart() { a=iRSI(NULL,0,2,PRICE_CLOSE,1); Comment(a); if(a>b) { Print("Сигнал SELL"); time=TimeCurrent(); ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrRed); if(!ObjectCreate(current_chart_id,obj_name,OBJ_VLINE,time,0)) { Print("Ошибка создания объекта: code #",GetLastError()); return(0); } d=d+1; obj_name="0"+d; } if(a { Print("Сигнал BUY"); time=TimeCurrent(); ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrBlue); if(!ObjectCreate(current_chart_id,obj_name,OBJ_VLINE,time,0)) { Print("Ошибка создания объекта: code #",GetLastError()); return(0); } d=d+1; obj_name="0"+d; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) {//---//--- return value of prev_calculated for next call return(rates_total); }//+------------------------------------------------------------------+ Ссылка на сообщение Поделиться на другие сайты More sharing options...
SilverKZ Опубликовано 26 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 сентября, 2016 boovood, не указали sub_windowif(!ObjectCreate(current_chart_id,obj_name,OBJ_VLINE,0,time,0)) 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
boovood Опубликовано 26 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 сентября, 2016 спасибо SilverKZ но не помогло так и рисует только одну линию а другие не хочет Ссылка на сообщение Поделиться на другие сайты More sharing options...
Николайец Опубликовано 26 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 сентября, 2016 Бьюсь над третьей домашкой. В советнике всё работает, только отложенные ордера селлстоп и байстоп при открытии тут же закрываются, хотя имеют свои стоплоссы и тэйкпрофиты.Помогите пожалуйста разобраться как заставить отложки жить своей жизнью и игнорировать при открытии сигналы на закрытие? Код ниже. Спойлер ----------------------------------------------------------+#property copyright "Copyright 2016, MetaQuotes Software Corp."#property link #property version "1.00"#property strictextern double Lots = 0.1;extern int TakeProfit = 300;extern int StopLoss = 50;extern int Magic = 111;extern int Slippage = 3;//-----------------------------------------------------extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern int Price = PRICE_CLOSE;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;//------------------------------------------------------//--- input parameters stohinput int InpKPeriod=5; // K Periodinput int InpDPeriod=3; // D Periodinput int InpSlowing=3; // Slowing//-----------------------------------------------------double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;int ticket, ticket2;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков... { TakeProfit *=10; StopLoss *=10; Slippage *=10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика// SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика// iStochastic - спец функция для стоха//------------------ Открытие и модификация селлов и установка страховочного байстопа----------------------- if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red); if (ticket>0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации селла"); } else Print ("Ошибка открытия селла"); ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного байстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Открытие и модификация баев и установка страховочного селлстопа----------------------------- if (CountBuy() == 0 && Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue); if (ticket>0) { TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации бая"); } else Print ("Ошибка открытия бая"); ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного sellстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Сигнал на закрытие и закрытие селла и удаление байстопа ----------------------------- if (Ask 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black)) Print ("Ошибка закрытия селла"); if (OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления байстопа"); } } }//-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа--------------------- if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) Print ("Ошибка закрытия бая"); if (OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления селлстопа"); } } }}//+------------------------------------------------------------------+int CountSell() // функция подсчёта селлов{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) count++; } } return(count);}//+------------------------------------------------------------------+int CountBuy() // функция подсчёта баев{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) count++; } } return(count);}//+------------------------------------------------------------------+ Изменено 26 сентября, 2016 пользователем Николайец Ссылка на сообщение Поделиться на другие сайты More sharing options...
Елена4 Опубликовано 27 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 сентября, 2016 Здравствуйте. Подскажите как подправить код, чтобы корректно считал уровень безубытка с учетом всех свопов и комиссий. Спасибо.for (int i=0; i if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()) { profit = OrderProfit()+OrderSwap()+OrderCommission(); Profit += profit; price = OrderOpenPrice(); lot = OrderLots(); if (OrderType()==OP_BUY ) { ProfitB += profit; price_b += price*lot; b++; lot_b+=lot; CS_buy=CS_buy+OrderCommission()+OrderSwap(); } if (OrderType()==OP_SELL) { ProfitS += profit; price_s += price*lot; s++; lot_s+=lot; CS_sell=CS_sell+OrderCommission()+OrderSwap(); } if (OrderType()==OP_BUY || OrderType()==OP_SELL) { ProfitSumm += profit; price_summ += price*lot; summ++; lot_summ+=lot; CS_summ=CS_summ+OrderCommission()+OrderSwap(); } } } double tick_value=MarketInfo(Symbol(),MODE_TICKVALUE); if (b!=0) { SLb = price_b/lot_b; SLb = SLb - (CS_buy/(tick_value*lot_b))*Point; } if (s!=0) { SLs = price_s/lot_s; SLs = SLs + (CS_sell/(tick_value*lot_s))*Point; } double delta_lot=MathAbs(lot_b-lot_s); if((b!=0 || s!=0) && delta_lot>0.0) { SLbsumm= (price_b-price_s)/(lot_b-lot_s); CS_buy=CS_buy+CS_sell; if(lot_b>lot_s) { SLbsumm = SLbsumm - (CS_buy/(tick_value*delta_lot))*Point; } if(lot_b SLbsumm = SLbsumm + (CS_buy/(tick_value*delta_lot))*Point; } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
kofesutra Опубликовано 27 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 сентября, 2016 Всем здравствуйте!Такая засада: код получается рабочий, но компилятор выдает предупреждение: "possible loss of data due to type conversion", ругается на строку datetime kTime=SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE); Между тем, SERIES_LASTBAR_DATE согласно документации имеет тип datetime.Как эти предупреждения убрать?Делаю в МТ5 build 1430 Ссылка на сообщение Поделиться на другие сайты More sharing options...
SilverKZ Опубликовано 27 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 сентября, 2016 Добрый день!SeriesInfoInteger возвращает значение типа long, kTime имеет тип datetime. Значение, возвращаемое SeriesInfoInteger, необходимо привести к типу datetime.Попробуйте сделать так: datetime kTime=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);Удачных торгов! 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
kofesutra Опубликовано 27 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 сентября, 2016 Попробуйте сделать так: Вот здОрово! Огромное вам спасибо, SilverKZ! Всё работает. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alex333 Опубликовано 28 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 сентября, 2016 Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.P.S. Если не туда написал, прошу прощения Ссылка на сообщение Поделиться на другие сайты More sharing options...
Atron100 Опубликовано 28 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 сентября, 2016 Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.P.S. Если не туда написал, прошу прощения я думаю Есть еще вариант: можно при подключении к счету просто ввести адрес и порт сервера. В этом случае Если вы не знаете адрес сервера, то его можно либо на сайте компании поискать, Ссылка на сообщение Поделиться на другие сайты More sharing options...
SilverKZ Опубликовано 28 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 сентября, 2016 спасибо SilverKZ но не помогло так и рисует только одну линию а другие не хочет Добрый день!Преобразуйте числовое значение в текстовую строкуobj_name="0"+DoubleToString(d); 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
boovood Опубликовано 28 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 сентября, 2016 SilverKZ огромное спасибо наконец то заработало так как надо! Ссылка на сообщение Поделиться на другие сайты More sharing options...
SVS696 Опубликовано 28 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 сентября, 2016 Товаrищи, может ли быть такое, что очень быстро приходящие тики сбивают логику совы? По документации тики пришедшие до того как тело программы отработает свой рабочий цикл должны игнорироваться. Но мне указывают именно на баги во время таких вот моментов, в другое время программа работает нормально.Проблема решиться допустим функцией sleep()? Ссылка на сообщение Поделиться на другие сайты More sharing options...
iPerevalov Опубликовано 29 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 сентября, 2016 Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.P.S. Если не туда написал, прошу прощения Alex333, да. Написали вы не совсем туда.Все перечисленные брокеры используют платформу MT. Поэтому вы можете беспрепятственно открыть в одном терминале все счета. [list type=decimal]Установите "чистый" MT4 (http://www.metatrader4.com/ru) Файл -> Подключиться к торговому счету Последний шаг выполняйте сколько раз, сколько пожелаете подключенных счетовДобавлено: 29-09-2016 02:20:20 Бьюсь над третьей домашкой. В советнике всё работает, только отложенные ордера селлстоп и байстоп при открытии тут же закрываются, хотя имеют свои стоплоссы и тэйкпрофиты.Помогите пожалуйста разобраться как заставить отложки жить своей жизнью и игнорировать при открытии сигналы на закрытие? Код ниже. Спойлер ----------------------------------------------------------+#property copyright "Copyright 2016, MetaQuotes Software Corp."#property link #property version "1.00"#property strictextern double Lots = 0.1;extern int TakeProfit = 300;extern int StopLoss = 50;extern int Magic = 111;extern int Slippage = 3;//-----------------------------------------------------extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern int Price = PRICE_CLOSE;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;//------------------------------------------------------//--- input parameters stohinput int InpKPeriod=5; // K Periodinput int InpDPeriod=3; // D Periodinput int InpSlowing=3; // Slowing//-----------------------------------------------------double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;int ticket, ticket2;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков... { TakeProfit *=10; StopLoss *=10; Slippage *=10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика// SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика// iStochastic - спец функция для стоха//------------------ Открытие и модификация селлов и установка страховочного байстопа----------------------- if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red); if (ticket>0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации селла"); } else Print ("Ошибка открытия селла"); ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного байстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Открытие и модификация баев и установка страховочного селлстопа----------------------------- if (CountBuy() == 0 && Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue); if (ticket>0) { TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации бая"); } else Print ("Ошибка открытия бая"); ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic, 0, Green);// установка страховочного sellстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Сигнал на закрытие и закрытие селла и удаление байстопа ----------------------------- if (Ask 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black)) Print ("Ошибка закрытия селла"); if (OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления байстопа"); } } }//-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа--------------------- if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) Print ("Ошибка закрытия бая"); if (OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления селлстопа"); } } }}//+------------------------------------------------------------------+int CountSell() // функция подсчёта селлов{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) count++; } } return(count);}//+------------------------------------------------------------------+int CountBuy() // функция подсчёта баев{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) count++; } } return(count);}//+------------------------------------------------------------------+ У вас ошибка в задании функций OrderSend() и OrderModify(). Объяснение: 50 пунктов, что вы ставите от цены у пятизначного брокера являются 5-ю пунктами. Поэтому, скорей всего, и получается почти мгновенное закрытие отложенных ордеров, потому что у вас SL = 5 пунктов (а вовсе не 50), а TP = 15 пунктов. Решение: [list type=decimal]Добавьте SL и TP во внешние параметры Добавьте соответствующие изменение в функцию OnInit(), чтобы при условии "трех- или пятизначности" брокера домножить SL и TP на 10 Измените функцию OrderSend() Измените функцию OrderModify() Если будут проблемы с этим ещё, то напишите. Изменено 29 сентября, 2016 пользователем iPerevalov Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alex333 Опубликовано 29 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 сентября, 2016 Как заставить терминал МТ4 открывать/входить на счета других серверов. Например: у меня открыты счета в телетрейде, альпари, форекфорю, на каждый счет мне нужен терминал именно того брокера, в котором открыт счет. Хотелось бы в одном терминале открывать/входить на счёт любого брокера. Возможно ли это? Спасибо.P.S. Если не туда написал, прошу прощения Alex333, да. Написали вы не совсем туда.Все перечисленные брокеры используют платформу MT. Поэтому вы можете беспрепятственно открыть в одном терминале все счета. [list type=decimal]Установите "чистый" MT4 Файл -> Подключиться к торговому счету Последний шаг выполняйте сколько раз, сколько пожелаете подключенных счетов Огромное спасибо буду пробовать Ссылка на сообщение Поделиться на другие сайты More sharing options...
Николайец Опубликовано 29 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 сентября, 2016 iPerevalov Цитата У вас ошибка в задании функций OrderSend() и OrderModify(). Спасибо. На самом деле вопрос решился введением второго мэджика для отложенных ордеров.В тестере теперь всё работает как было задумано. Спойлер #property strictextern double Lots = 0.1;extern int TakeProfit = 300;extern int StopLoss = 50;extern int Magic = 111;extern int Magic2 = 222; //что бы второй ордер не закрывался по сигналуextern int Slippage = 3;//-----------------------------------------------------extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern int Price = PRICE_CLOSE;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;//------------------------------------------------------//--- input parameters stohinput int InpKPeriod=5; // K Periodinput int InpDPeriod=3; // D Periodinput int InpSlowing=3; // Slowing//-----------------------------------------------------double PriceHigh, PriceLow, SL, TP, MainLineStoh, SignalLineStoh;int ticket, ticket2;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if (Digits == 3 || Digits == 5) // если после запятой в цене 3 или 5 знаков... { TakeProfit *=10; StopLoss *=10; Slippage *=10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ PriceHigh = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); // вверхняя цена индикатора PriceLow = iCustom (NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); // нижняя цена индикатора MainLineStoh = iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 0, 0); // главная линия стохастика// SignalLineStoh= iCustom (NULL, 0, "Stochastic", InpKPeriod, InpDPeriod, InpSlowing, 1, 0); // сигнальная линия стохастика// iStochastic - спец функция для стоха//------------------ Открытие и модификация селлов и установка страховочного байстопа----------------------- if (CountSell() == 0 && Bid >= PriceHigh && MainLineStoh >= 90) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red); if (ticket>0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации селла"); } else Print ("Ошибка открытия селла"); ticket2 = OrderSend(Symbol(), OP_BUYSTOP, Lots, NormalizeDouble(Ask+50*Point,Digits),Slippage, 0, 0, "TMA", Magic2, 0, Green);// установка страховочного байстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Ask+50*Point,Digits),NormalizeDouble(Ask-50*Point,Digits),NormalizeDouble(Ask+150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Открытие и модификация баев и установка страховочного селлстопа----------------------------- if (CountBuy() == 0 && Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue); if (ticket>0) { TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации бая"); } else Print ("Ошибка открытия бая"); ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, NormalizeDouble(Bid-50*Point,Digits),Slippage, 0, 0, "TMA", Magic2, 0, Green);// установка страховочного sellстопа if (ticket2>0) { if (OrderSelect(ticket2, SELECT_BY_TICKET)) if(!OrderModify(ticket2,NormalizeDouble(Bid-50*Point,Digits),NormalizeDouble(Bid+50*Point,Digits),NormalizeDouble(Bid-150*Point,Digits),0)) Print ("Ошибка модификации байстопа"); } else Print ("Ошибка открытия байстопа"); }//----------------Сигнал на закрытие и закрытие селла и удаление байстопа ----------------------------- if (Ask 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black)) Print ("Ошибка закрытия селла"); if (OrderMagicNumber() == Magic2 && OrderType() == OP_BUYSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления байстопа"); } } }//-------------------Сигнал на закрытие и закрытие бая и удалениеселлстопа--------------------- if (Bid >= (PriceHigh+PriceLow)/2 && CountBuy() > 0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) Print ("Ошибка закрытия бая"); if (OrderMagicNumber() == Magic2 && OrderType() == OP_SELLSTOP) if(!OrderDelete (ticket2)) Print ("Ошибка удаления селлстопа"); } } }}//+------------------------------------------------------------------+int CountSell() // функция подсчёта селлов{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) count++; } } return(count);}//+------------------------------------------------------------------+int CountBuy() // функция подсчёта баев{ int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) count++; } } return(count);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Елена4 Опубликовано 29 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 сентября, 2016 Добрый вечер. Подскажите функцию, которая выведет на экран объем последней открытой позиции.Спасибо Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sergey Forex Опубликовано 30 сентября, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 сентября, 2016 Добрый вечер. Подскажите функцию, которая выведет на экран объем последней открытой позиции.Спасибо Посмотрите этот код: Спойлер //+------------------------------------------------------------------+//найти лот последнего ордераdouble FindLastOrderLots()//лот последнего ордера{ int oticket, ticketnumber = 0; double olot = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { oticket = OrderTicket(); if(oticket>ticketnumber) { ticketnumber = oticket; olot = OrderLots(); } } } } Comment("Лот последнего ордера = " + DoubleToStr(olot, 2)); return(olot); } 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти