0ll Опубликовано 5 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 марта, 2015 77павел не хотите проценты берите в деньгах - просто и сердито.dslone я думаю дело в объектах, которые Вы создаёте в Инит и не удаляете. При перезапуске МТ пытается создать объекты с теми-же именами и получает ошибку. т.е. в Вашем индюке при перезапуске процедура Инит вылетает с ошибкой. Надо чистить объекты за собой или перед созданием проверять наличие...kempo у Вас в OrderLots() что происходит? + if(!OrderClose....) здесь что-то напутали с логикой + эту строчку: _OR_err = GetLastError(); надо перед Принтом ставить (после OrderClose), а то не понятно когда ошибка возникла.+ в начале функции желательно воткнуть ResetLastError();oleguitar Вы как всегда недоговариваете... У Вас советник или индюк? если индюк нужны буфера со стрелочками. если сова, то надо графический объект создавать. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 5 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 марта, 2015 Индюк был бы лучше, но я только писать не умею их совершенно...Допустим, мне нужно, чтобы отмечались стрелоской все свечи, размер которых более N пунктов Ссылка на сообщение Поделиться на другие сайты More sharing options...
kempo Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 OrderLots() возвращает количество лотов выбранного ордера...а что не так???а на счет OrderClose...в чем именно нарушена логика???PS функцию мне написали чуть ранее, Денис помоему, поэтому сейчас пытаюсь самодогоняй врубить...С ув. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 oleguitar скачай любой индюк со стрелочками и замени начинку.kempo насчет OrderLots это я прогнал >:dнасчёт логики: "Ф-ция OrderClose Возвращает true при успешном завершении функции или false в случае ошибки."Получается что Принт ошибки работает когда её нет (из-за !). И разберитесь с определением ошибки - в идеале нужно так:ResetLastError(); if(!OrderClose.... ) {//Блок обработки ошибки _OR_err = GetLastError(); Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));}else {//Ордер закрыт без ошибки ....} Ссылка на сообщение Поделиться на другие сайты More sharing options...
kempo Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 oleguitar скачай любой индюк со стрелочками и замени начинку.kempo насчет OrderLots это я прогнал >:dнасчёт логики: "Ф-ция OrderClose Возвращает true при успешном завершении функции или false в случае ошибки."Получается что Принт ошибки работает когда её нет (из-за !). И разберитесь с определением ошибки - в идеале нужно так:ResetLastError(); if(!OrderClose.... ) {//Блок обработки ошибки _OR_err = GetLastError(); Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));}else {//Ордер закрыт без ошибки ....} прошу прощения ув. Oll за глупый вопрос...что я должен написать в этой строчке???else {//Ордер закрыт без ошибки ....} Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 kempo напиши Print("Удалил всё-таки!");, а если серьёзно - не знаю. Вот это: error = true; - зачем писали? Ссылка на сообщение Поделиться на другие сайты More sharing options...
kempo Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 если я все правильно понял, то вот так....но все равно не работает...ошибка так и не уходит...bool Close_Orders(int mag, int otype) { int _OR_err; for (int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == mag && OrderType() == otype) { if (otype == OP_BUY) RefreshRates(); ResetLastError(); if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_BID), Slippage, clrBlue)) { _OR_err = GetLastError(); Print("Ошибка закрытия ордера " + IntegerToString(_OR_err)); } else Print("Хозяин, я удалил ордера!!!"); if (otype == OP_SELL) RefreshRates(); ResetLastError(); if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_ASK), Slippage, clrRed)) { _OR_err = GetLastError(); Print("Ошибка закрытия ордера " + IntegerToString(_OR_err)); } else Print("Хозяин, я удалил ордера!!!"); } Sleep(500); } } return(false);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ttomas Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 Я тут заметил нарушение структуры, вы проверяете тип ордера и потом просто обновляете данные, нужно наверное просто добавить пару фигурных скобочек.bool Close_Orders(int mag, int otype) { int _OR_err; for (int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == mag && OrderType() == otype) { if (otype == OP_BUY) { RefreshRates(); ResetLastError(); if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_BID), Slippage, clrBlue)) { _OR_err = GetLastError(); Print("Ошибка закрытия ордера " + IntegerToString(_OR_err)); } else Print("Хозяин, я удалил ордера!!!");} if (otype == OP_SELL){ RefreshRates(); ResetLastError(); if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_ASK), Slippage, clrRed)) { _OR_err = GetLastError(); Print("Ошибка закрытия ордера " + IntegerToString(_OR_err)); } else Print("Хозяин, я удалил ордера!!!");} } Sleep(500); } } return(false);} 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
kempo Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 ааааа Ttomas большое спасибо Вам))))вроде заработало)))) Ссылка на сообщение Поделиться на другие сайты More sharing options...
dslone Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 dslone я думаю дело в объектах, которые Вы создаёте в Инит и не удаляете. При перезапуске МТ пытается создать объекты с теми-же именами и получает ошибку. т.е. в Вашем индюке при перезапуске процедура Инит вылетает с ошибкой. Надо чистить объекты за собой или перед созданием проверять наличие... удаление есть в OnDeinit, только в выложенном файле оно закомментировано. Если раскомментировать, то после перезапуска терминала, на месте вывода лотов появляются надписи Label. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 6 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2015 А есть примеры таких индикаторов?А то я смотрю, сложноватые всеВот такое переделал, но он не отображается даже в индикаторахp.s. все комментарии писал не я Спойлер #property copyright "-" #property link "-" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буфферов #property indicator_buffers 2 //---- цвета индикатора #property indicator_color1 Blue #property indicator_color2 Red //---- входные параметры индикатора extern int atr_period = 100; extern double atr_k = 3; int MA_Slow = 260; //---- индикаторные буфферы double buf_1[]; double buf_2[]; //+------------------------------------------------------------------+ //| Функция инициализации, запускается один раз | //+------------------------------------------------------------------+ int init() { //---- 2 индикаторных буффера использованы для счёта SetIndexBuffer(0, buf_1); SetIndexBuffer(1, buf_2); //---- Стиль исполнения графика //---- DRAW_ARROW - стрелки(символы) SetIndexStyle (0, DRAW_ARROW, STYLE_SOLID, 3); SetIndexStyle (1, DRAW_ARROW, STYLE_SOLID, 3); SetIndexArrow (0, 233); SetIndexArrow (1, 234); //---- установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); //---- установка номера бара, начиная с которого будет отрисовываться индикатор SetIndexDrawBegin(0,MA_Slow); SetIndexDrawBegin(1,MA_Slow); //---- завершение инициализации return (0); } //+------------------------------------------------------------------+ //| Основная Функция, запускается на каждом тике | //+------------------------------------------------------------------+ int start() { //---- проверка количества баров на достаточность для расчёта if (Bars //---- получение уже посчитанных баров int ExtCountedBars = IndicatorCounted(); //---- проверка на возможные ошибки if (ExtCountedBars //---- последний посчитанный бар должен быть пересчитан if (ExtCountedBars > 0) ExtCountedBars--; //---- основной цикл расчёта индиатора for (int i=Bars - ExtCountedBars-1;i>=0; i--) { //---- получение значений индикатора в переменные double high1 = High[1]; double low1 = Low[1]; double open1 = Open [1]; double close1 = Close [1]; double atr = iATR(Symbol(), 0, atr_period, 1);/* double MA_Fast_1 = iMA(NULL, 0, MA_Fast, 0, MODE_EMA, PRICE_CLOSE, i+1); double MA_Slow_1 = iMA(NULL, 0, MA_Slow, 3, MODE_LWMA, PRICE_CLOSE, i+1); double MA_Fast_2 = iMA(NULL, 0, MA_Fast, 0, MODE_EMA, PRICE_CLOSE, i+2); double MA_Slow_2 = iMA(NULL, 0, MA_Slow, 3, MODE_LWMA, PRICE_CLOSE, i+2); */ //---- проверка условий по вашим правилам и отрисовка стрелки// if (MA_Fast_1 > MA_Slow_1 && MA_Fast_2 // if (MA_Fast_1 = MA_Slow_2) buf_2[i+1] = High[i+1] + 10 * Point; if(close1 { if((high1-close1) > NormalizeDouble((atr*atr_k),5)) buf_2[i+1] = High[i+1] + 10 * Point; } if(close1>open1) { if((open1-low1) > NormalizeDouble((atr*atr_k),5)) buf_1[i+1] = Low[i+1] - 10 * Point; } } //---- завершение основной функции return (0); } //---- end Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 7 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 марта, 2015 oleguitar переписал для 600 билда. изучай пользуйся.Добавил дельту (отступ) от графика, а то за стрелками его не видно+ исправил логику вместо: open1-low1 - close1-low1.Ind_Strelki.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 7 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 марта, 2015 oleguitar переписал для 600 билда. изучай пользуйся.Добавил дельту (отступ) от графика, а то за стрелками его не видно+ исправил логику вместо: open1-low1 - close1-low1. Ага, спасибо большое)С логикой поэкспериментирую еще Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik Опубликовано 12 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 марта, 2015 Всем привет!Знающим прошу помочь:как рассчитать профит закрытого ордера на бинарных опционах?после закрытия ордера в истории счета пишет (см вложении 1). в данном случае профит считает=0.после отображения ВСЕЙ истории (см вложение 2) профит считает=0.7.как рассчитать что бы после закрытия ордера, профит считался сразу=0.7?функция расчета профита вот такая:double profit(){ int oldticket; double orderprofit=0.0; ticket = 0; for (int i=OrdersHistoryTotal()-1; i>=0;i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == OP_BUY||OrderType() == OP_SELL)) { oldticket=OrderTicket(); if(oldticket>ticket) { orderprofit=OrderProfit()+OrderCommission()+OrderSwap(); ticket=oldticket; } } } } return (NormalizeDouble(orderprofit,2));} 1.png2.png Изменено 13 марта, 2015 пользователем Crik Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 13 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 марта, 2015 Crik не знаю чем Вам помочь... Профит, который считает сова и профит который показывает МТ - разные вещи, совсем, тем более не при обычных торгах, а в опционах - это же по-сути пари, а размер маржи - Ваша ставка... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik Опубликовано 13 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 марта, 2015 Crik не знаю чем Вам помочь... Профит, который считает сова и профит который показывает МТ - разные вещи, совсем, тем более не при обычных торгах, а в опционах - это же по-сути пари, а размер маржи - Ваша ставка... тогда почему, при нажатии отображения ВСЕЙ истории профит ордера становится =(профит ордера)+(стоимость выигрыша по закрытию опциона), в данном случае =0+0,7=0,7 Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 13 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 марта, 2015 Oll, Доброго времени, после событий в январе с франком. я все таки решил к своей сове прикрутить стопы.но вот не задача.к одной паре без проблем. а вот одновременно к семи парам,не получается.хотя фильтрация ордеров идет по магику.Задача состоит в том что бы прикрутить стоп лоссы и тейк профиты к 7 разным валютным парам.Вы наверное помните эту систему, вы даже индикатор писали для нее, как говорится своего производства.Подскажите, если не затруднит, как разобраться с этим делом, пока хотя бы в теории.В практике попробую сам,ну ели, не будет получаться,тогда уже буду дальше интересоваться! Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 13 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 марта, 2015 denis77515 кукловод наверно...Дык стопы прикручиваются через тикет ордера, только цены надо брать через МаркетИнфо.Я не писал мультивалютных роботов - таких задач не стояло, но не вижу препятствий.А без стопов Ваш бот как идёт? большие просадки? Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 13 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 марта, 2015 Да честно говоря последнее время,не очень он работает, в том смысле что сама система. Я в теме кукловода ссылку на мониторинга оставил, посмотрите.Но она еще система такая что на долго срок, если даст 100% прибыли в течении года, то сам думаю ее на реал ставить, а пока все эксперименты,да доработки. Я сидел тут как то пару дней сней,так в тол и не взял, как можно смодифицировать сразу кучу ордеров,да еще по разным парам. Вы имеете в виду, в ордео селект, за место селект бай пос, написать селект бай тикет. и от этого, уже смотреть дальше ? Жаль сегодня пятница,завтра если напишу, то проверить не смогу. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 Вы имеете в виду, в ордео селект, за место селект бай пос, написать селект бай тикет. и от этого, уже смотреть дальше ? Нет я точно имел в виду другое... :d1. Одна сова открывает все ордера? или эти ордера по другому открываете?2. Если магики одинаковые, делаете цикл с сортировкой по магику. В итоге у Вас выбран (Select) ордер.3. Рассчитываете уровень СЛ, типа: MarketInfo(OrderSymbol(), MODE_BID) + SL*_Point;4. Ну и модификация...5. Если данная конструкция заработает в тестере на одной паре, то в реале и на всех работать будет. Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 Oll спасибо за совет,буду думать как приминить ваш совет на практике, а сова открывает 7 ордеров по разным валютным парам с одинаковым магиком.Вот моя функция для установки стоп лосса и тейк профита, вот ее я хочу прикрутить к сове. Спойлер [bool ModifyOrder(int mag, int otype=-1 ,string sy=""){double sl = 0, tp = 0; if (sy=="0") sy=Symbol(); for(int i=OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if((OrderSymbol() == sy || sy =="") && (mag { if(otype == OP_BUY || otype == OP_SELL) { if(otype == OP_BUY) { while(true) { sl = High[1] - iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_SL; tp = High[1] + iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_TP; OrderModifyReliable(OrderTicket(),OrderOpenPrice(),sl,tp,0,clrGreenYellow);break; } } else if(otype == OP_SELL) { while(true) { sl = High[1] + iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_SL; tp = High[1] - iATR(Symbol(),0,ATR_Period,ATR_Shift) * ATR_Multipler_TP; OrderModifyReliable(OrderTicket(),OrderOpenPrice(),sl,tp,0,clrGreenYellow); break; } } } } } }return(false);}] Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 denis77515 сомневаюсь, что код рабочий - полно ошибок.1. АТР вычисляй 1 раз ДО цикла, что-ж Вы в цикле на каждом проходе 4 раза к индюку обращаетесь? (я не знаю как компилятор МТ устроен, но призываю не надеяться на его эффективность)2. Стопы для Селл по хаям - это понимаю, а стопы для бая по хаям ? про ТР - молчу, хотя если цена убежала от хая далеко, то вычисленный по хаю ТР не установится, а проверки нет...3. Проверки успешности модификации нет. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 denis77515 сомневаюсь, что код рабочий - полно ошибок.1. АТР вычисляй 1 раз ДО цикла, что-ж Вы в цикле на каждом проходе 4 раза к индюку обращаетесь? (я не знаю как компилятор МТ устроен, но призываю не надеяться на его эффективность)2. Стопы для Селл по хаям - это понимаю, а стопы для бая по хаям ? про ТР - молчу, хотя если цена убежала от хая далеко, то вычисленный по хаю ТР не установится, а проверки нет...3. Проверки успешности модификации нет. Oll я пробовал по лоу, ставить, не получилось, не модефицирует совсем, по этому я сделал там мультиплер. допустим по бай, sl = High[1] - iATR * 2,33, а tp = High[1] + iATR*3,5, не знаю работает, пользуюсь пока скриптом.по поводу проверки модификации так OrderModifyReliable здесь целая функция проверки на ошибки.вот она. Спойлер bool OrderModifyReliable(int aticket, double aprice, double stoploss, double takeprofit, datetime expiration, color arrow_color = CLR_NONE) { if (IsStopped()) { Print("Ошибка, остановлен: IsStopped() == true"); return(false); } int cnt = 0; while(!IsTradeAllowed() && cnt { Sleep(100); cnt++; } if (!IsTradeAllowed()) { Print("Ошибка: Операция недопустима - IsTradeAllowed()==false"); _OR_err = ERR_TRADE_CONTEXT_BUSY; return(false); }// if (false) { if(OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES)) string asymbol = OrderSymbol(); int adigits = MarketInfo(asymbolx, MODE_DIGITS); if (adigits > 0) { aprice = NormalizeDouble(aprice,adigits); stoploss = NormalizeDouble(stoploss,adigits); takeprofit = NormalizeDouble(takeprofit,adigits); } if (stoploss != 0) OrderReliable_EnsureValidStop(asymbolx,aprice,stoploss); } int err = GetLastError(); // so we clear the global variable. err = 0; _OR_err = 0; bool exit_loop = false; cnt = 0; bool result = false; while (!exit_loop) { if (IsTradeAllowed()) { result = OrderModify(aticket, aprice, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); _OR_err = err; } else cnt++; if (result == true) exit_loop = true; switch (err) { case ERR_NO_ERROR: exit_loop = true; break; case ERR_NO_RESULT: exit_loop = true; break; case ERR_SERVER_BUSY: case ERR_NO_CONNECTION: case ERR_INVALID_PRICE: case ERR_OFF_QUOTES: case ERR_BROKER_BUSY: case ERR_TRADE_CONTEXT_BUSY: case ERR_TRADE_TIMEOUT: // for modify this is a retryable error, I hope. cnt++; // a retryable error break; case ERR_PRICE_CHANGED: case ERR_REQUOTE: RefreshRates(); continue; // we can apparently retry immediately according to MT docs. default: // an apparently serious, unretryable error. exit_loop = true; break; } // end switch if (cnt > retries) exit_loop = true; if (!exit_loop) { Print("Ошибка, попыток: (" + IntegerToString(cnt) + "/" + IntegerToString(retries) + "): " + OrderReliableErrTxt(err)); Sleep(500); RefreshRates(); } if (exit_loop) { if ((err != ERR_NO_ERROR) && (err != ERR_NO_RESULT)) Print("Ошибка: " + OrderReliableErrTxt(err)); } } // we have now exited from loop. if ((result == true) || (err == ERR_NO_ERROR)) { Print("Успешная модификация"); if(OrderSelect(aticket, SELECT_BY_TICKET, MODE_TRADES)) OrderPrint(); return(true); // SUCCESS! } if (err == ERR_NO_RESULT) { return(true); } Print("Ошибка модификации после " + IntegerToString(cnt) + " попыток"); Print("Ошибка модификации: " + IntegerToString(aticket) + " " + asymbolx + "@" + DoubleToStr(aprice,_Digits) + " tp@" + DoubleToString(takeprofit,_Digits) + " sl@" + DoubleToString(stoploss,_Digits)); Print("Ошибка : " + OrderReliableErrTxt(err)); return(false); }//+------------------------------------------------------------------+void OrderReliable_EnsureValidStop(string asymbol, double aprice, double &asl) { // Return if no S/L if (asl == 0) return; double servers_min_stop = MarketInfo(asymbol, MODE_STOPLEVEL) * MarketInfo(asymbol, MODE_POINT); if (MathAbs(aprice - asl) { // we have to adjust the stop. if (aprice > asl) asl = aprice - servers_min_stop; // we are long else if (aprice asl = aprice + servers_min_stop; // we are short else Print("EnsureValidStop: error, passed in aprice == sl, cannot adjust"); asl = NormalizeDouble(asl, MarketInfo(asymbol, MODE_DIGITS)); }}//+------------------------------------------------------------------+string OrderReliableErrTxt(int err) { return ("" + IntegerToString(err) + ":" + ErrorDescription(err)); }] Ссылка на сообщение Поделиться на другие сайты More sharing options...
ilxam Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 Помогите пожалуйста с кодом функции работающий 4 знаком. Суть функции такова.Чтоб советник открыл сделку на покупку когда цена направляется на вверх на определенный тик без отката (например 4 или 5 пункта без возврата, нужна чтоб можно указать в параметрах) и соответственно на продажу, если цена направляется вниз, и чтоб ордер был только одним т.е. чтоб не открывал пока не закроется другой. И нужно добавить трейлинг стоп в пунктах, чтоб можно было изменить в параметрах. СЛ и ТП думаю добавлю сам как то.Спасибо! Изменено 14 марта, 2015 пользователем ilxam Ссылка на сообщение Поделиться на другие сайты More sharing options...
Deymos Опубликовано 14 марта, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 марта, 2015 Господа, я только начал программить после просмотра трех уроков видео курса)) сразу столкнулся с проблемой. Значит требуется сделать советник на основе индикатора ТМА. По задумке сова продает от верхней границы индикатора, покупает от нижней. Спойлер extern double Lots = 0.1;extern int StopLoss = 30;extern int TakeProfit = 30;extern int Slippage = 5;extern string comment = "TMA BOT";extern int Magic = 123; extern string Indicator = "Данные индикатора"; 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; double PriceHigh, PriceLow, SL, TP, OT; int ticket, count;//+------------------------------------------------------------------+int init() { //Проверка брокера на пятизнак if (Digits ==3 || Digits == 5) TakeProfit *=10; StopLoss *=10; Slippage *=10; }//+------------------------------------------------------------------+int deinit() { return(0); }//+------------------------------------------------------------------+void OnTick(){ /// Обозначаем верхнюю и нижнюю границы канала ТМА PriceHigh = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); PriceLow = iCustom(Symbol(), 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); //Условия на продажу if(Bid >= PriceHigh && CountSell() == 0 ) { SL=NormalizeDouble(Bid + StopLoss*Point, Digits); TP=NormalizeDouble(Bid - TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); if ( ticket > 0) { if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true) OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 ); } } //Условия на покупку if( Ask { SL=NormalizeDouble(Ask - StopLoss*Point, Digits); TP=NormalizeDouble(Ask + TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); if ( ticket > 0) { if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true) OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 ); } }}//+------------------------------------------------------------------+int CountBuy(){ count = 0; for (int trade = OrdersTotal()-1; trade >=0; trade --) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() ==Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY) count ++; } } return(count);}//+------------------------------------------------------------------+int CountSell(){ count = 0; for (int trade = OrdersTotal()-1; trade >=0; trade --) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() ==Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_SELL) count ++; } } return(count); } В общем советник делает все что хочет, только не то что хочу я:( Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти