0ll Опубликовано 6 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 сентября, 2017 раздвигаются обе цены или только Аск подпрыгивает?Это как повезёт, может и в оба конца прыгнуть... 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bryanwins Опубликовано 6 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 сентября, 2017 Всем привет!Ребята подскажите пожалуйста.Я хочу чтобы ордер открывался по условиям. MA1>MA2.И закрывался по условиям MA1Пример- Спойлер if(kolpos==0) { //-покупка if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера. return; } if(kolpos==1) //-закрытие ордера по условиям { if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue)) return; }//- return; } Но в журнале при тесте у меня ошибка, как разрулить? Ошибка 4111 видимо что-то не так в функции OrderClose. пробовал множество вариантов, все глухо. Весь код если нужен. Спойлер //+------------------------------------------------------------------+//| Простой РСИ.mq4 |//| BW |//| https://www.mql5.com |//+------------------------------------------------------------------+extern int Magic = 070517; // майджик extern int SL = 80; // стоплоссextern int TP = 80; // тайкпрофитextern int Slip = 3; // проскальзываниеextern double Lot = 0.01; // лотextern double Martin = 1; // множительextern double PerMA = 15; // период МАextern double PerMA2 = 18; // Период МА2extern double ModeMA = 2; // Стиль МАextern double RSIper = 14; // Период РСИ//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { if(Digits==3 || Digits==5) // пересчитал торговлю для { TP*=10; // трехзнака и пятизнака, SL*=10; // или для более корректной } return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) {//--- }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() {//+------------------------------------------------------------------+//объявление переменных double iLot =0, Ordprofit =0, lott =0, MA =iMA(Symbol(),PERIOD_CURRENT,PerMA, 0,ModeMA,PRICE_CLOSE,1), MA2 =iMA(Symbol(),PERIOD_CURRENT,PerMA2,0,ModeMA,PRICE_CLOSE,1), RSI =iRSI(Symbol(), PERIOD_CURRENT,RSIper,PRICE_CLOSE,0);if(OrdersHistoryTotal()>0) { for(int i=OrdersHistoryTotal(); i>=0; i--) //цикл подсчета ордеров { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue; if( (OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderSymbol()== Symbol() && OrderMagicNumber() == Magic) { Ordprofit=OrderProfit(); lott=OrderLots(); break; } }}if (Ordprofit>=0)iLot=Lot;//получили прибыль, уменьшили лот if (Ordprofit//+-------------------------------------------------------------------+ //Объявление переменных Машки итд//+------------------------------------------------------------------+ int kolpos=0; for(int pos=0; pos { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) // из всех торговых ордеров, выбрать один. Проверить, а есть ли он вообще. { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) //проверил чей выбранный ордер kolpos++; //-- и посчитал его } }//+------------------------------------------------------------------+Comment("\nЛот = ",iLot, "\nTP = ",TP, "\nSL = ",SL); // принт в углу экрана Следующий лот//+------------------------------------------------------------------+//функция открытия ордеров if(kolpos==0) { //-покупка if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера. return; } if(kolpos==1) //-закрытие ордера по условиям { if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue)) return; }//- return; }//+------------------------------------------------------------------+-------+ Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 7 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 сентября, 2017 А что возвращает Вам OrderTicket() в функции закрытия? если Вы ордер не выбрали?"Пересечения" средних у Вас на каждом тике срабатывать будут, ибо МА1 > МА2 может пол-дня сохраняться.Короче: факт пересечения МА устанавливается на 2 барах текущего ТФ, а именно - if ( MA1[1] > MA2[1] && MA1[2] После срабатывания условия пересечения надо закрывать СЕЛЛ и открывать БАЙ, для другого пересечения - наоборот.При закрытии ордера делайте цикл по открытым ордерам (например СЕЛЛ) и закрывайте все так:OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,Blue); 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
maxstah Опубликовано 7 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 сентября, 2017 Интересует правильное написание функции OrderSend() для торговли бинарными опционами.Брокер: GoMarkets. Для торговли бинарными опционами использует дополнительное ПО для МТ4. Когда нажимаешь в МТ4 открыть новый ордер, то появляется такое окно:после открытия ордера в комментариях такая запись:В тех.поддержке GoMarkets сказали, что никаких инструкций не дают по торговле советниками на бинарных опционах, и что торговля советниками на бинарных опционах возможна только на реальных счетах. Вот пытаюсь разобраться если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли? И если сработает, то где брать программным путем информацию сколько процентов выплаты "..../70%" по конкретной валютной паре? PO_GoMarkets.pngBO_EURUSD.png Изменено 7 сентября, 2017 пользователем maxstah 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bryanwins Опубликовано 7 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 сентября, 2017 Короче: факт пересечения МА устанавливается на 2 барах текущего ТФ, а именно - if ( MA1[1] > MA2[1] && MA1[2] Пробую переписать условия покупки как вы сказали! Но что-то пошло не так. Когда к МА1 добавляю [1] компилятор ругается. Вот скрин с примером. Спойлер Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 8 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 сентября, 2017 Когда к МА1 добавляю [1] компилятор ругается. Понятно, я думал Вы знакомы с mql...Вам нужно объявить переменные double ma11, ma12, ma21, ma22;В основном коде отслеживать закрытие свечи, и как свеча закрылась, делать так:ma12 = ma11; ma11 = iMA(...period1...); // точки ... - то сокращения, в код писать не надо.ma22 = ma21; ma21 = iMA(...period2...);А после этого можно писать условия по машкам.ПС: код, определяющий закрытие свечи найди сам.Добавлено: 08-09-2017 06:11:19если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли?Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...Программно можно читать размер % из коммента с помощью строковых операторов. Изменено 8 сентября, 2017 пользователем 0ll 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
maxstah Опубликовано 8 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 сентября, 2017 Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...Программно можно читать размер % из коммента с помощью строковых операторов. У другого брокера в поддержке подсказали, что в комментариях к ордеру надо добавлять:"BO exp:900", где 900 - это время истечения ордера в секундах.Создал скрипт для открытия ордера, сработало.Такая запись в комментариях сработала для демо счетов NoaFX и GDMFX, других брокеров не проверял. Ссылка на сообщение Поделиться на другие сайты More sharing options...
slavahl Опубликовано 8 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 сентября, 2017 Всем привет!Господа знающие, подскажите, пожалуйста, как ограничить работу советника по торговым сессиям? Например, чтоб начинал торговать в европейскую и американскую сессию. Какие команды используются? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 8 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 сентября, 2017 "BO exp:900", где 900 - это время истечения ордера в секундах.Хорошо. мы роде про % выплат говорили. Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 10 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 сентября, 2017 Свежий урок:http://tradelikeapro.ru/mql4-analiz-tikovoy-istorii/ 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Richie Rich Опубликовано 11 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 сентября, 2017 Здравствуйте, коллеги. Нужна помощь! :( Спойлер Есть некий советник. Прикреплён ниже. Работает он следующим образом:- Если цена выше машки - открывается покупка. Если ниже - продажа.- ТП = 200. СЛ = процент средней волатильности за последние 10 свечей.- Максимум открытых ордеров - только один.- На каждой свече - максимум один ордер.- Торговля начинается только с новой свечи (минуя свечу, на которой запустился советник).(Вышеизложенное описание не являться ключевым. Просто, что бы советник хоть как-то работал.)В настройках можно указать направление торгов (только бай, либо только селл, либо в оба направления). Также можно указать, отдельно, для покупок и продаж рассчёт лота. Если вкл. автоматический расчёт - лот будес расссчитываться, исходя из параматра Risk.Лот ордеров считается для бай и селл отдельно. Лот покупок - из функции Lot_b().Лот продаж - из функции Lot_s().В настройках можно дать возможность работать системе Парлай (удвоение лота следующего ордера, после прибыльной сделки):- переключатель вкл\выкл "Parlay".- максимальное кол-во ордеров в "сетке".Парлай правильно работает, если разрешить работу только на покупку, либо только на продажу.Так как, в этом случае работает только одна функция рассчёта лота. С этим проблем не возникает.Другой вопрос, если вести торговлю в обе стороны, с режимом Парлай.Здравый разум даёт мне понять, что суть в том что лот считается для бай и селл отдельно.Постараюсь на примере объяснить :(буду рассчитывать пример из фиксированного лота, то есть 0.01. Включённого Парлая, и Максимальным кол-вом ордеров в сетке равном трём.)1й ордер - бай (0.01) - убыток. (следующий значит опять с 0.01)2й ордер - селл (0.01) - прибыль. (следующий ордер - удвоенный.)3й ордер - бай (0.02) - прибыль. (всё хорошо. прибыль. Значит следующий опять с удвоенным.)4й ордер - бай (0.04) - прибыль. (третий подряд ордер с удвоенным лотом (0.01-0.02-0.04), значит следующий ордер - только с 0.01)5й ордер - селл (0.08) - не важно. (но ордер почему-то открылся опять с увеличенным лотом. Так как ордер открылся не бай, а селл.)6й ордер - бай (0.01) (и вновь всё нормально.)Ситуация может неоднократно повторяться.Вопрос: Как реализовать правильный расчёт Парлая, независимо от направления открытия ордеров.При этом имея возможность отдельно выбирать расчёт лота. То есть, по прежнему иметь две разных функции для расчёта лота на бай и селл отдельно.Ситуация не имела бы места, если б я использовал одинаковый стоп для покупок и продаж. Лот бы тогда рассчитывался из одной бы функции.А так как у меня с разными значениями расчитываеться стоплосс для покупок и продаж - приходиться заниматься подобным головняком, описанном выше. Львиную долю ошибок уже исправил, а вот правильный расчёт Парлая, с разными значениями стопов - всё никак...Извиняюсь за тавтологию. Очень сложно письменно перенести суть проблемы. Nekiy_Sovetnik.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alex Fato Опубликовано 11 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 сентября, 2017 Как сделать что б индикатор работал только по закрытию свечи?Типа вот так?Или там надо prevtime нормализовать? Спойлер if(Time[0] == prevtime) return(0);//ждём появления нового бара prevtime = Time[0];//если появился новый бар , включаемся Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 11 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 сентября, 2017 Или там надо prevtime нормализовать?prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime; Ссылка на сообщение Поделиться на другие сайты More sharing options...
Richie Rich Опубликовано 12 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 сентября, 2017 Здравствуйте, коллеги. Нужна помощь! В функциях "Lot_b()" и "Lot_s()" упоминалась одна и таже статистическая переменная - "static int c=1".Поэтому кол-во ордеров в сетке считалось отдельно.Достаточно было удалить из функций эту переменную и записать её в начале кода во внешний блок.И тогда обе функции, работающие независимо друг от друга - обращаются к одному счётчику.Что и влечёт за собой правильную лотность при построение сеточки ордеров.Лишний раз убедился, что иногда единственным способом нахождения ошибки является - глубокая ночь, кружка чая, и десятки раз посимвольного перебора кода. :) 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Alex Fato Опубликовано 12 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 сентября, 2017 Или там надо prevtime нормализовать?prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime; Да, все верноstatic int prevtime = 0; // В глобальныхНо выдает ошибку:possible loss of data due to type conversionИз неё индикатор ваще пропадает с графика.Как это решить? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 13 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 сентября, 2017 static int prevtime = 0; // В глобальныхВы внимательно читали? я про datetime писал - тогда не будет ошибок конвертации. Ссылка на сообщение Поделиться на другие сайты More sharing options...
t11001 Опубликовано 14 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2017 Как заставить терминал подавать звуковой сигнал после закрытия 5ти минутного бара, если цена за этот период касалась уровней, которые нацело делятся на 2.5? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2017 Пробуй Alert(); он издаёт звук и текст выводит. Ссылка на сообщение Поделиться на другие сайты More sharing options...
t11001 Опубликовано 14 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2017 пусть вместо звукового сигнала будет алерт Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 14 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2017 Привет! Как я уже писал тебе в личку, закрытие бара можно определить по времени.В входных параметрах объявляем переменнуюdatetime new_bar;if(Time[0]!=new_bar)//новый бар, значит старый секунд назад закрылся что тебе и нужно { if(тарам пам пам условие твоего деления)//это может быть функция или что то еще. Если целое число то заходим в скобки если нет то Alert не сработает. { Alert(); } new_bar=Time[0]; }P.S. я думаю стоит переименовать заголовок темы. Главная проблема это как узнать, что после деления получилось целое число, а не дробное. Ссылка на сообщение Поделиться на другие сайты More sharing options...
t11001 Опубликовано 14 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2017 Думаю проще будет вписывать уровни в код советника, а тот просто будет оповещать, если этот уровень пересекался предыдущим баром. На первое время и так сойдёт, хоть в голове место освободится. А для деления отдельную тему заведу Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 сентября, 2017 Главная проблема это как узнать, что после деления получилось целое число, а не дробное.Это не проблема: MathMod(); Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 15 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 сентября, 2017 Это не проблема: MathMod(); Приветствую!В математики я полный >D-b Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 сентября, 2017 Она выдаёт остаток от деления. Если остаток = 0, то поделилось нацело, например:if ( MathMod ( 100, 10 ) = 0 ) Alert ( "Поделилось нацело!" ) ;MathMod ( 102, 10 ) = 2 - это остаток от деления нацело.Не знаю что имел в виду t11001, если точное касание (не пересечение!), то исследуем Хай и Лоу закрывшейся свечи:if ( MathMod ( High[1], 2.5 ) = 0 ) Alert ( "коснулось уровня 2.5 хаем!" ) ; Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 27 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 сентября, 2017 Новый урок:http://tradelikeapro.ru/testirovanie-na-realnoy-istorii/ 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти