Здравстуйте, товарищи знатоки. Нужна ваша помощь в корректировке индикатора. Суть индикатора такова. Рассчитать величину повышения цены относительно предыдущего бара. За ноль берётся бар звезда. То есть цена открытия равно цене закрытия. При компиляции ошибок нет, но при тестировании выдаёт ошибку на строке 80 20 символа. Так же криво отрисовывает сигнальную линию. Но думаю это причина именно в неправильном расчёте основного буфера. Помогите исправить.
Get a unique domain name plus our FREE value-added services to help you get the most from it. Call it a "dot-com name," a URL, or a domain. Whatever you call it, it's the cornerstone of your online presence, and we make getting one easy. Simply enter the name you want in the search field above, and we'll tell you instantly whether the name is...
Снова здравствуйте. Уделите пожалуйста внимание вопросу новичка. Требуется указать на ошибки в коде, т.к. в тестере, советник не открывает ордера... При этом компилятор не выдает ошибок и предупреждений, в журнале аналогично - ошибок нет...
ВОПРОС. Почему вместо разницы между текущей ценой и значением переменной Hay, которая должна быть числом <1( как это было в mql4) , mql5 вычисляет и отображает непонятные мне выражения , например, 2.99999999 -(минус)05 .
Как сделать так что бы mql5 правильно считал разницу между данными значениями? Я нормализовывал все значения при помощи NormalizeDouble(), но вышеуказанные значения
отображались без изменений. Это странно для меня , ведь оба значения типа doble
Всем спасибо за помощь.
#include <Trade\Trade.mqh>
int tm, s1 ;
double P=SymbolInfoDouble(Symbol(),SYMBOL_BID),S=P+0.0030,T=P-0.0010,Lou,Hay,DL=0.0030;
CTrade m_Trade; //структура для выполнения торговых операций//=============================================================================================================voidOnTick()
{
Print("===============",SymbolInfoDouble(Symbol(),SYMBOL_BID) - Hay,"===Hay====",Hay,"===SymbolInfoDouble()====",SymbolInfoDouble(Symbol(),SYMBOL_BID));
m_Trade.Sell(0.1,Symbol(),P,S,T);
Hay=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
Здравствуйте, Иван! Никто новичков здесь не ругает, а наооборот, стараются помогать. Сам являюсь таким же новичком. Теперь, что касаемо Вашего вопроса. Несколько позиций открываются потому, что проверку на открытие позиции сделали, а прекратить выполнение проверки забыли. Оператор возврата return возвращает управление вызвавшей программе (взято из Справочника MQL5).
Нужно добавить return в код советника (выделен жёлтым шрифтом):
Кроме того, чтобы компилятор не выдавал предупреждения, в условиях открытия позиций Buy и Sell необходимо добавить ещё одно условие для проверки OrderSend(mrequest,mresult). Это условие задается оператором if и будет выглядеть так:
И ещё необходимо учесть один момент. Бывает так, что при переходе с одного торгового дня на другой в 23:59:59 ранее открытая позиция закрывается и тут же в 00:00:00 открывается новая позиция. Это происходит так называемый rollover close и rollover open, который зависит от конкретного форекс-дилера и его условий торговли. Поищите на форуме, где-то была про это информация.
С уважением, Владимир.
Здравствуйте.
Спасибо большое за ваш ответ! Но мне непонятно для чего нужен оператор return? Ведь в данном коде два условия и проверка должна прекратиться при выполнении одного из них.
//--- есть ли открытые позиции?bool Buy_opened=false; // переменные, в которых будет храниться информация bool Sell_opened=false; // о наличии соответствующих открытых позицийif(PositionSelect(_Symbol)==true) // есть открытая позиция
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) // если истина, выполняем условие 1
{
Buy_opened=true; //это длинная позиция
}
elseif(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) // иначе выполняем условие 2
{
Sell_opened=true; // это короткая позиция
}
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
По двум точкам на прямой можно найти цену произвольной третьей точки на этой прямой, в том числе и в будущем (и наоборот).
Спасибо! Буду пробовать.
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? Ведь в данном коде два условия и проверка должна прекратиться при выполнении одного из них.
Или это не так?