Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1293
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По двум точкам на прямой можно найти цену произвольной третьей точки на этой прямой, в том числе и в будущем (и наоборот).
Спасибо! Буду пробовать.
P.S. Единственное. С первого взгляда не пойму. В советнике, в МТ4 будет работать?
//+------------------------------------------------------------------+ //| MSBB.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <MovingAverages.mqh> #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 clrGreen #property indicator_color2 clrRed #property indicator_width1 1 input int InpMSBBPeriod=3; // Period input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA; // Method //--- indicator buffers double ExtMSBBBuffer[]; double ExtTempBuffer[]; double ExtPriceBuffer[]; double ExtSignalBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(void) { //--- indicator buffers mapping IndicatorDigits(Digits-2); //--- drawing settings IndicatorBuffers(4); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,ExtMSBBBuffer); SetIndexBuffer(1,ExtSignalBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,ExtTempBuffer); SetIndexBuffer(2,ExtPriceBuffer); SetIndexDrawBegin(1,InpMSBBPeriod); //--- name for DataWindow and indicator subwindow label IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")"); SetIndexLabel(0,"MSBB"); SetIndexLabel(1,"Signal"); //--- 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[]) { int i;//limit; //------ if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2) return(0); /*//--- counting from 0 to rates_total ArraySetAsSeries(ExtMSBBBuffer,false); ArraySetAsSeries(ExtSignalBuffer,false); ArraySetAsSeries(open,false); ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false);*/ //--- // limit=rates_total-prev_calculated; //if(prev_calculated>0) // limit++; //--- typical price and its moving average for(i=0; i<rates_total; i++) { ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2); ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2); //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i]; //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]); if(ExtTempBuffer[i]==0) ExtMSBBBuffer[i]=0.0; if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i] = 0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0) { double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2); if((price_open<0 && price_close>0)||(price_open>0 && price_close<0)) ExtMSBBBuffer[i]=0.0; if((price_open<0 && price_close<0)||(price_open>0 && price_close>0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0) { double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2); double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2); if((price_open>0 && price_close<0)||(price_open<0 && price_close>0)) ExtMSBBBuffer[i]=0.0; if((price_open>0 && price_close>0)||(price_open<0 && price_close<0)) ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open; } //--- signal line counted in the 2-nd buffer //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0); SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer); Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]); //--- done } /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0) { ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i]; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } if(ExtPriceBuffer[i]==0) { ExtMSBBBuffer[i] = 0.0; Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]); } }*/ //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+Добрый день!
Помогите, пожалуйста, с советником.
Он совершает сделки по сигналам RSI от уровней 30 и 70 в соответствующем направлении, создает сетку.
В него вшит вроде как стоплосс от % убытка, но периодически зависают ордера и не закрываются, пока не закроешь вручную или не сольешь депозит.
То есть открываются ордера, цена уже ушла на 5000 пипсов и дальше, а они до сих пор висят в минусе.
Нужно найти ошибку. А если это невозможно, то вшить в советник отдельный Стоплосс по убытку в пунктах.
Я пробовал объединить 2 советника в один, но с моими навыками ничего не вышло.
Здравствуйте. Подскажите, пожалуйста. Нужно получить количество пунктов пройденное за последний тик. Но что-то не выходит.
Здравствуйте. Подскажите, пожалуйста. Нужно получить количество пунктов пройденное за последний тик. Но что-то не выходит.
Попробуйте так.
Попробуйте так.
Снова здравствуйте.
Уделите пожалуйста внимание вопросу новичка.
Требуется указать на ошибки в коде, т.к. в тестере, советник не открывает ордера...
При этом компилятор не выдает ошибок и предупреждений, в журнале аналогично - ошибок нет...
Всем доброго времени суток!
Пытаюсь перейти с mql4 на mql5.
ВОПРОС. Почему вместо разницы между текущей ценой и значением переменной Hay, которая должна быть числом <1( как это было в mql4) , mql5 вычисляет и отображает непонятные мне выражения , например, 2.99999999 -(минус)05 .
Как сделать так что бы mql5 правильно считал разницу между данными значениями? Я нормализовывал все значения при помощи NormalizeDouble(), но вышеуказанные значения
отображались без изменений. Это странно для меня , ведь оба значения типа doble
Всем спасибо за помощь.
Здравствуйте, Иван! Никто новичков здесь не ругает, а наооборот, стараются помогать. Сам являюсь таким же новичком. Теперь, что касаемо Вашего вопроса. Несколько позиций открываются потому, что проверку на открытие позиции сделали, а прекратить выполнение проверки забыли. Оператор возврата return возвращает управление вызвавшей программе (взято из Справочника MQL5).
Нужно добавить return в код советника (выделен жёлтым шрифтом):
Кроме того, чтобы компилятор не выдавал предупреждения, в условиях открытия позиций Buy и Sell необходимо добавить ещё одно условие для проверки OrderSend(mrequest,mresult). Это условие задается оператором if и будет выглядеть так:
И ещё необходимо учесть один момент. Бывает так, что при переходе с одного торгового дня на другой в 23:59:59 ранее открытая позиция закрывается и тут же в 00:00:00 открывается новая позиция. Это происходит так называемый rollover close и rollover open, который зависит от конкретного форекс-дилера и его условий торговли. Поищите на форуме, где-то была про это информация.
С уважением, Владимир.
Здравствуйте.
Спасибо большое за ваш ответ! Но мне непонятно для чего нужен оператор return? Ведь в данном коде два условия и проверка должна прекратиться при выполнении одного из них.
Или это не так?