dima0603 Опубликовано 1 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 июня, 2016 1. Подключаете индикатор к сове через iCustom2. Опрашиваете его с некой периодичностью3. если значение индикатора станет соответствовать Вашим условиям - открываете ордер Спасибо большое!!!! вот только как задать эту периодичность??? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 июня, 2016 Спасибо большое!!!! вот только как задать эту периодичность???функция ОнТик() запускается на каждом тике - это довольно часто, если Вы хотите получать значения индикатора с 1 бара, то Вам нужна функция по определению закрытия 0-бара ( здесь не раз выкладывалась ). если Вы планируете использовать значения индикатора с 0-бара, то можно на каждом тике или ожидать прохода ценой некой дистанции. Ссылка на сообщение Поделиться на другие сайты More sharing options...
geugene Опубликовано 2 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 июня, 2016 Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alastar Опубликовано 2 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 июня, 2016 Сабж. Как проверить свечу, где уже был получен Тейк Профит? Самый быстрый, примитивный и надежный способ кто-нибудь знает? Главное что бы не загромождать код и не нагружать систему. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 июня, 2016 Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alastar Опубликовано 2 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 июня, 2016 Выясняете время закрытия ордера ( OrderCloseTime() ), потом номер свечи, содержащей это время ( iBarShift() ) и по номеру проверяете всё что хотите. Я наделся на какую-то встроенную фитчу, о которой возможно не знаю... Ну а так есть масса вариантов. Все-равно спасибо за ответ. Добавлено: 02-06-2016 18:58:08Первое, что попалось на глаза. Может кому пригодится еще... //+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара закрытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) | int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal(); if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op { if (mn { if (t } } } } } } return(iBarShift(sy, tf, t, True)); } Изменено 2 июня, 2016 пользователем Alastar Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 3 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 июня, 2016 Уважаемые кодеры! Не могли бы в следующих обучающих видео рассмотреть интерактивные вопросы: кнопки, окна и т.д.К примеру, создать кнопку для активации скрипта. Это эффективнее и быстрее, чем в навигаторе активировать. Можно создать горячую клавишу, выбираешь скрипт, добавить горячую клавишу, комбинацию кнопок для вызова скрипта(или индикатора, или советника), и в один клик можно добавлять скрипт на график. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 3 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 июня, 2016 К примеру, создать кнопку для активации скрипта. Это немного выходит за рамки МКЛ. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sergey Forex Опубликовано 6 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 июня, 2016 Уважаемые программисты!Ситуация: бот открывает ордер бай. Цена идет против нас и через определенное количество пунктов, бот открывает противоположный ордер селл с удвоенным лотом. Подскажите как рассчитать СЛ и ТП, чтобы закрыться в безубыток + n пунктов?То есть для удвоенного ордера надо рассчитать ТП, а для первого, который в убытке, надо рассчитать СЛ, чтобы суммарно выйти в безубыток. Заранее благодарю. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 июня, 2016 Sergey Forex простое уравнение:убыток_бай = прибыль_селл,или лотБай * ( цБУ - цОткрБай ) * стоимПипс = лотСелл * ( цБУ - цОткрСелл ) * стоимПипс,или цБУ = ( лотБай * цОткрБай - лотСелл * цОткрСелл ) / ( лотБай - лотСелл );распиши на бумажке и внимательно проверь знаки. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mischkus Опубликовано 7 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 июня, 2016 Вопрос к Сергею по урокам программированию MQL.К третьему уроку по программированию "Как написать советник" Вы не даете готовых кодов советника на индикаторе TMA Fair. И это правильно: новичку наколотить код советника потребуется не один день, зато создается ощущение приобщенности к великому.Я буква в букву повторил все коды этого советника и наткнулся на глупейшую ошибку, которой в самом начале и быть-то не должно, потому что были скопированы данные самого индикатора TMA Fair (см. прилож.), почему я и обращаюсь за помощью к Сергею помочь убрать эту ошибку. В начале всегда трудно.Михаил. 2016-06-07_1.jpg Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 7 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 июня, 2016 mischkus не хватает точки с запятой в самом конце 17й строки. Ссылка на сообщение Поделиться на другие сайты More sharing options...
mischkus Опубликовано 8 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 июня, 2016 dermitau, большое спасибо. Мелочь, а не видна. Ссылка на сообщение Поделиться на другие сайты More sharing options...
geugene Опубликовано 8 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 июня, 2016 К примеру, создать кнопку для активации скрипта. Это немного выходит за рамки МКЛ. разве? ProTrader не на mql создан? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 8 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 июня, 2016 К примеру, создать кнопку для активации скрипта. Это немного выходит за рамки МКЛ.разве? ProTrader не на mql создан?Для активации скрипта нужно отправить активному окну коды горячих клавиш. это делается через АПИ виндовс, т.е. программа на МКЛ вызывает библиотеку виндовс и её использует, согласитесь этот приём не может быть отнесён к МКЛ, ибо там бездна возможностей, всего не опишешь... В любом случае примеры кода есть и Вы всегда можете самостоятельно изучить и использовать. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 10 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 июня, 2016 Подскажите пожалуйста ошибку трейлинга, в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально? //+------------------------------------------------------------------+ void Trailing() { for(int i =0; i { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice() >tr_stop*Point) { if(OrderStopLoss() { SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits); if(OrderStopLoss()!=SL) { if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true) Print("Ордер на покупку по трейлинг стопу успешно модифицирован"); else Print("Ордер на покупку не модифицирован, код ошибки",GetLastError()); } } } } if(OrderType()==OP_SELL) { if(OrderOpenPrice()-Ask>tr_stop*Point) { if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point) SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits); if(OrderStopLoss()!=SL) { if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true) Print("ордер на продажу по трейлинг стопу успешно модифицирован"); else Print("Ордер на продажу не модифицирован, код ошибки",GetLastError()); } } } } } } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 10 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 июня, 2016 блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!! ~x( ~x( ~x(я уже даже писал с какго хера это происходит на нулеовм-процессорном уровне, один фиг не помогает...за это тьмы сила тебя поглотит if(OrderStopLoss()!=SL) юзай вот это вместо "!=" при сравнении стоплоссов и с миром юный падаван уходи. Спойлер bool GD(double number1,double number2,int dig) { if(NormalizeDouble(MathAbs(number1-number2),dig)>0) return(true); else return(false); } надеюсь, ферштейн? либо юзай описанную выше булевую функцию либо делай в коде разницу между переменными и задавай точность сравнения. хотя это тоже самое что и выше, только тут красивее решение Изменено 10 июня, 2016 пользователем dermitay 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 10 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 июня, 2016 Я обычно так сравниваю ( если, конечно, не мультивалютная сова ) : вместо if ( OrderStopLoss() != SL )if ( MathAbs( OrderStopLoss() - SL ) >= _Point ) 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 10 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 июня, 2016 за это тьмы сила тебя поглотит И силы тьмы окутали ученика, хотя сам мастер из мастеров, кодокрушитель, создатель армий себе подобных, непревзойденный учитель света (XBSM, или ака Сергей), учил в свойх творениях сие безобразие(урок по трейлинг стопу), а я как послушный ученик смотрел ему в глаза, широко разинув рот. И ломались стульчики и табуретки летели в сторону, взвыв взметнулась вверх лазерная струя, верного соратника и друга в бесчисленных боях - лазерного меча, опаляя густые ресницы обманутого ученика. Дрожали руки и тяжелый пот скатывался с могучего лба. Я чуствовал что осталься один шаг для перехода на темную сторону, но поняв что возврата не будет, я глубоко вздохнул и став на одно колено приготовился слушать своего учителя. который вот вот должен что нить написать.Добавлено: 10-06-2016 14:55:13блин сколько раз уже говорилось, никогда не сравнивай дабловые переменные!!! это ересь и БОХНАКАЖЕТ!!!!! Может создать тему для юных програмистов самых грубых(или не очень) ошибок кодостроения, которые существенно могут влиять на работу советника, чтобы делать качественные экперты? А то заколебалось уже узнавать все в последнюю очередь. Думаю нам есть чему поучится у опытных прогеров MQL4!Добавлено: 11-06-2016 06:20:16 Подскажите пожалуйста ошибку трейлинга, в журнале пишет на продажу" ордер модифи 130" - неправильные стопы , проверял, но так и не понял . На покупку все вроде нормально? //+------------------------------------------------------------------+ void Trailing() { for(int i =0; i { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice() >tr_stop*Point) { if(OrderStopLoss() { SL=NormalizeDouble(OrderStopLoss()+tr_step*Point,Digits); if(OrderStopLoss()!=SL) { if(OrderModify(OrderTicket(),Bid,SL,0,0,0)==true) Print("Ордер на покупку по трейлинг стопу успешно модифицирован"); else Print("Ордер на покупку не модифицирован, код ошибки",GetLastError()); } } } } if(OrderType()==OP_SELL) { if(OrderOpenPrice()-Ask>tr_stop*Point) { if(OrderStopLoss()>Ask+(tr_stop+tr_step+sl)*Point) SL=NormalizeDouble(OrderStopLoss()-tr_step*Point,Digits); if(OrderStopLoss()!=SL) { if(OrderModify(OrderTicket(),Ask,SL,0,0,0)==true) Print("ордер на продажу по трейлинг стопу успешно модифицирован"); else Print("Ордер на продажу не модифицирован, код ошибки",GetLastError()); } } } } } } } Нашел ошибку в трейлинге. SL заявлена как глобальная переменная, и в трейлинге используется как на продажу, так и на покупку, переписывая ее при модификаций, отсюда и вся путаница. Если есть открытые ордера на продажу и покупку, то где то, что то запутается, отсюда и ошибка 130(неправильные стопы). Нужно всего лишь в трейлинге изменить переменную, например на продажу, SL_1, тогда ошибка исчезнет. И работает всетаки, изменил по вашему, ошибка не исчезла. Спасибо, может кому пригодится. Изменено 11 июня, 2016 пользователем vitek01 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Foxonn Опубликовано 12 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 июня, 2016 Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает. Спойлер extern double Lots = 0.01;extern double StopLoss = 0;extern double TakeProfit = 5;extern int Slippage = 3;extern int Magic = 101010;extern string Martin = "Настройка мартина";extern int Step = 15;extern double Multipler = 2.0;extern string TMATrend = "Настройка TMA";extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;extern int Shift = 5;double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;int ticket;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; Step *= 10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ //-------------------------------------------------------- double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1); PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1); double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift); //--------------------------------------------------------if (CountTrade() == 0) { if (Bid >= PriceHight && Trend >= PriceHight) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red); TP = NormalizeDouble (Bid - TakeProfit * Point, Digits); } if (Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue); TP = NormalizeDouble (Ask + TakeProfit * Point, Digits); } } else { int order_type = FindLastOrderType(); if (order_type = OP_BUY) { Price = FindLastOrderPrice(OP_BUY); if (Ask { Lastlot = FindLastLots (OP_BUY); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue); if (ticket Print("Ошибка открытия ордера на покупку"); ModifyOrders(OP_BUY); } }if (order_type = OP_SELL) { Price = FindLastOrderPrice(OP_SELL); if (Bid >= Price + Step*Point) { Lastlot = FindLastLots (OP_SELL); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red); if (ticket Print("Ошибка открытия ордера на продажу"); ModifyOrders(OP_SELL); } } } }//+------------------------------------------------------------------+void ModifyOrders(int otype){ double avg_price, order_lots=0; Price = 0; for (int i = OrdersTotal()-1; i >=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { Price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble (Price / order_lots, Digits); if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits); if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits); for (int j = OrdersTotal()-1; j >=0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)) Print("Ордера успешно модифицированы"); else Print ("Ошибка при модифицировании ордеров"); } } } }//+------------------------------------------------------------------+double FindLastLots (int otype){ int oldticket; double oldlots=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldlots = OrderLots(); } } } return(oldlots); }}//+------------------------------------------------------------------+double FindLastOrderPrice(int otype){ int oldticket; double oldopenprice=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } return(oldopenprice); }}//+------------------------------------------------------------------+int FindLastOrderType(){ for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) return (OrderType()); } } return(-1);} //+------------------------------------------------------------------+int CountTrade() { int count = 0; for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if (OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return (count);}//+------------------------------------------------------------------+ Советник+индикаторTMAEA+TMAFair.rar Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 12 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 июня, 2016 Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает. Спойлер extern double Lots = 0.01;extern double StopLoss = 0;extern double TakeProfit = 5;extern int Slippage = 3;extern int Magic = 101010;extern string Martin = "Настройка мартина";extern int Step = 15;extern double Multipler = 2.0;extern string TMATrend = "Настройка TMA";extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;extern int Shift = 5;double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;int ticket;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; Step *= 10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ //-------------------------------------------------------- double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1); PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1); double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift); //--------------------------------------------------------if (CountTrade() == 0) { if (Bid >= PriceHight && Trend >= PriceHight) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red); TP = NormalizeDouble (Bid - TakeProfit * Point, Digits); } if (Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue); TP = NormalizeDouble (Ask + TakeProfit * Point, Digits); } } else { int order_type = FindLastOrderType(); if (order_type = OP_BUY) { Price = FindLastOrderPrice(OP_BUY); if (Ask { Lastlot = FindLastLots (OP_BUY); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue); if (ticket Print("Ошибка открытия ордера на покупку"); ModifyOrders(OP_BUY); } }if (order_type = OP_SELL) { Price = FindLastOrderPrice(OP_SELL); if (Bid >= Price + Step*Point) { Lastlot = FindLastLots (OP_SELL); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red); if (ticket Print("Ошибка открытия ордера на продажу"); ModifyOrders(OP_SELL); } } } }//+------------------------------------------------------------------+void ModifyOrders(int otype){ double avg_price, order_lots=0; Price = 0; for (int i = OrdersTotal()-1; i >=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { Price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble (Price / order_lots, Digits); if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits); if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits); for (int j = OrdersTotal()-1; j >=0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)) Print("Ордера успешно модифицированы"); else Print ("Ошибка при модифицировании ордеров"); } } } }//+------------------------------------------------------------------+double FindLastLots (int otype){ int oldticket; double oldlots=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldlots = OrderLots(); } } } return(oldlots); }}//+------------------------------------------------------------------+double FindLastOrderPrice(int otype){ int oldticket; double oldopenprice=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } return(oldopenprice); }}//+------------------------------------------------------------------+int FindLastOrderType(){ for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) return (OrderType()); } } return(-1);} //+------------------------------------------------------------------+int CountTrade() { int count = 0; for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if (OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return (count);}//+------------------------------------------------------------------+ Там ошибки некоторые исправил, копатся дальше не стал, ордера не открывает все равно, но вычислил что условие на открытие ордеров неверное, отметил в коментариях, посмотрите гдн неправильно! В индикаторах не разбираюсь, незнаю что там изменять надо.TMA_Fair_.mq4TMAEA.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Foxonn Опубликовано 12 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 июня, 2016 Ошибку та и не нашел, пришлось переписать код заново, проблема решилась. Спойлер Не открываются сделки, есть другой советник не мартин с точно такими же условиями на открытие сделки и он работает. Спойлер extern double Lots = 0.01;extern double StopLoss = 0;extern double TakeProfit = 5;extern int Slippage = 3;extern int Magic = 101010;extern string Martin = "Настройка мартина";extern int Step = 15;extern double Multipler = 2.0;extern string TMATrend = "Настройка TMA";extern string TimeFrame = "current time frame";extern int HalfLength = 56;extern double ATRMultiplier = 2.0;extern int ATRPeriod = 100;extern bool Interpolate = true;extern int Shift = 5;double SL, TP, PriceHight, PriceLow, Trend, CenterLine, Price, Lastlot;int ticket;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; Step *= 10; } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ //-------------------------------------------------------- double PriceHight = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,1); PriceLow = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,2,1); double Trend = iCustom(0,0,"TMA_Fair ",TimeFrame,HalfLength,ATRMultiplier,ATRPeriod,1,Shift); //--------------------------------------------------------if (CountTrade() == 0) { if (Bid >= PriceHight && Trend >= PriceHight) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "1-й ордер на продажу", Magic, 0, Red); TP = NormalizeDouble (Bid - TakeProfit * Point, Digits); } if (Ask { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "1-й ордер на покупку", Magic, 0, Blue); TP = NormalizeDouble (Ask + TakeProfit * Point, Digits); } } else { int order_type = FindLastOrderType(); if (order_type = OP_BUY) { Price = FindLastOrderPrice(OP_BUY); if (Ask { Lastlot = FindLastLots (OP_BUY); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_BUY, Lastlot, Ask, Slippage, 0, 0, 0, Magic, 0, Blue); if (ticket Print("Ошибка открытия ордера на покупку"); ModifyOrders(OP_BUY); } }if (order_type = OP_SELL) { Price = FindLastOrderPrice(OP_SELL); if (Bid >= Price + Step*Point) { Lastlot = FindLastLots (OP_SELL); Lastlot = NormalizeDouble (Lastlot * Multipler, 2); ticket = OrderSend(Symbol(), OP_SELL, Lastlot, Bid, Slippage, 0, 0, 0, Magic, 0, Red); if (ticket Print("Ошибка открытия ордера на продажу"); ModifyOrders(OP_SELL); } } } }//+------------------------------------------------------------------+void ModifyOrders(int otype){ double avg_price, order_lots=0; Price = 0; for (int i = OrdersTotal()-1; i >=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { Price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble (Price / order_lots, Digits); if (otype == OP_BUY) TP = NormalizeDouble(avg_price + TakeProfit * Point, Digits); if (otype == OP_SELL) TP = NormalizeDouble(avg_price - TakeProfit * Point, Digits); for (int j = OrdersTotal()-1; j >=0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)) Print("Ордера успешно модифицированы"); else Print ("Ошибка при модифицировании ордеров"); } } } }//+------------------------------------------------------------------+double FindLastLots (int otype){ int oldticket; double oldlots=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldlots = OrderLots(); } } } return(oldlots); }}//+------------------------------------------------------------------+double FindLastOrderPrice(int otype){ int oldticket; double oldopenprice=0; ticket=0; for (int cnt = OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } return(oldopenprice); }}//+------------------------------------------------------------------+int FindLastOrderType(){ for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) return (OrderType()); } } return(-1);} //+------------------------------------------------------------------+int CountTrade() { int count = 0; for (int trade = OrdersTotal()-1; trade >=0; trade--) { if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if (OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return (count);}//+------------------------------------------------------------------+ Там ошибки некоторые исправил, копатся дальше не стал, ордера не открывает все равно, но вычислил что условие на открытие ордеров неверное, отметил в коментариях, посмотрите гдн неправильно! В индикаторах не разбираюсь, незнаю что там изменять надо. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mischkus Опубликовано 15 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июня, 2016 Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.Ошибок и некритических замечаний не получил.По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же. Добавлено: 15-06-2016 16:40:43Добавлено: 15-06-2016 16:41:09Добавлено: 15-06-2016 16:41:41Да, в журнале ошибок чисто. Аттачу (см. выше)Martin_1.jpgMartin_2.jpgMartin_3.jpg Изменено 15 июня, 2016 пользователем mischkus Ссылка на сообщение Поделиться на другие сайты More sharing options...
Foxonn Опубликовано 15 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июня, 2016 Спойлер Очередной вопрос к Сергею по урокам программированию MQL: "Программирование советника на мартингейле".Как всегда, буква в букву два дня смотрел и переписывал урок по мартину.Ошибок и некритических замечаний не получил.По итогу: управления от iMa нет (включал/выключал - нет), работают только покупки под "машкой", мультипликатор (сам мартин) не работает - лотность одна и та же. Добавлено: 15-06-2016 16:40:43Добавлено: 15-06-2016 16:41:09Добавлено: 15-06-2016 16:41:41Да, в журнале ошибок чисто. Аттачу (см. выше) Снизу прикрепил советник работает как в уроке. Спасибо Сергею за его уроки по MQL, теперь для себя пишу советники :dMartin.mq4 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 16 июня, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 июня, 2016 Столкнулся с такой проблемой, если if(Close[1]>High[2]) // if(iClose[(1.00001)]>High[(1.00001)]){------}else if(Close[1][(1.00001)][(1.00001)]) { ------- }Как сравнить более точно если так получилось что клозе и не больше и не меньше хайя? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти