пишу ж, что типы компилятор сам подставляет в момент вызова шаблонной функции, если такого вызова еще не было в коде, то компилятор создаст еще одну копию функции и поставит сам типы - ну как бы логично - шаблон
если вопрос про как в такой функции определить тип, используйте
typename
UPD: дописал в пример выше принты типа параметров:
//--- buffers (массивы под буферы индикатора)//--------------------------------------------------------------------double RSI[]; // буфер под RSI//--------------------------------------------------------------------double MAr1_fast[]; // буфер под быструю МАdouble MAr2_slow[]; // буфер под медленную МАdouble MAr2_slowColor[]; // буфер под цвета медленной МА//--------------------------------------------------------------------double MAr3_slow_glob[]; // буфер под глобальную медленную МАdouble MAr3_slow_globColor[]; // буфер под цвета глобальной медленной МА//--------------------------------------------------------------------
По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).
Двухцветность за счет способа рисования DRAW_COLOR_LINE.
Теперь вопрос: первая линия (буфера 2 и 3 в коде выше) прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit; вторая линия почему-то выпендривается: например явно не срабатывает строка:
PlotIndexSetString (4, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная. Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?
Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....
И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?
Добрый день. Столкнулся с некоторой странностью при написании индикатора на MQL5 (индикатор в отдельном подокне, 4 линии).
Начальные описания буферов такие:
Далее в OnInit:
По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).
Двухцветность за счет способа рисования DRAW_COLOR_LINE.
Теперь вопрос: первая линия (буфера 2 и 3 в коде выше) прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit; вторая линия почему-то выпендривается: например явно не срабатывает строка:
Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная. Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?
Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....
И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?
Нумерация отображений отличается от нумерации буферов.
PlotIndexSetString (3, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Доброго времени суток. Хочу написать советник, основанный на измерении угла наклона скользящей средней (а лучше набора таковых, а именно Аллигатор), чтоб советник выдавал алерт при сильном импульсе цены, желательно с малым запаздыванием. Подскажите пожалуйста как измерить угол МА или "объяснить советнику" что произошёл импульс. Может есть какие либо уже известные способы это решить. Или к примеру бесплатный индикатор основанный на вычислении резких импульсов?
Написал функцию для нахождения номера бара фрактала из 3х баров. На онлайн графике вроде определяет правильно. А при визуальном тестировании в тестере врёт. Может кто-нибудь из профессионалов, глянув на код, обнаружит какие-нибудь огрехи?
Буду премного благодарен.
//+----------------------------------------------------------------------------+//| Описание : Возвращает номер бара трёхбарного фарактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер экстремума ( 0 - последний) |//+----------------------------------------------------------------------------+int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
if(sy=="" || sy=="0") sy=Symbol();
int nlext=0,k=iBars(sy,tf);
nlext=0;
if(mode==MODE_UPPER)
{
for (int i=2; i<=k; i++)
{
if(High[i]>High[i+1] && High[i]>High[i-1])
{
nlext++;
if(nlext>ne) return(i);
}
}
}
if(mode==MODE_LOWER)
{
for (i=2; i<=k; i++)
{
if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
{
nlext++;
if(nlext>ne)
{
//Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);return(i);
}
}
}
}
Print("Бар локального экстремума не найден");
return(-1);
}
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
datetime data=D'2020.09.16 20:07'; // Time Blockif(TimeCurrent()>data)
{
Print("Демонстрационный период закончился, покупайте индикатор :)");
Alert("Демонстрационный период закончился, покупайте индикатор :)");
return(INIT_FAILED);
}
if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
Comment("Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :)");
return(0);
}
в цикле закрытии ордеров хотел поставить услвие на день открытия ордера, чтобы те которые в пятницу открылись не закрывались. но почему то цикл не идет..
while (OrdersTotal()>0)
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
elsePrint("NoMagic ", OrderMagicNumber()); // for Debug
}
elsePrint( "Error when order select ", GetLastError());
}
Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)
Тебе не в OnInit надо писать данный код, а в OnTick().
в цикле закрытии ордеров хотел поставить услвие на день открытия ордера, чтобы те которые в пятницу открылись не закрывались. но почему то цикл не идет..
Попробуйте так:
for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5))
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(result!=TRUE) { error=GetLastError();
Print("LastError = ",error, " ",Symbol()); }
else error=0;
}
else Print("NoMagic ", OrderMagicNumber()); // for Debug
}
else Print( "Error when order select ", GetLastError());
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
А как узнать тип входного параметра?
пишу ж, что типы компилятор сам подставляет в момент вызова шаблонной функции, если такого вызова еще не было в коде, то компилятор создаст еще одну копию функции и поставит сам типы - ну как бы логично - шаблон
если вопрос про как в такой функции определить тип, используйте
typenameUPD: дописал в пример выше принты типа параметров:
2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)
2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) 5
2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)
2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) 40
UPD: дополнил еще __FUNCSIG__ этот пример
Добрый день.
Столкнулся с некоторой странностью при написании индикатора на MQL5 (индикатор в отдельном подокне, 4 линии).
Начальные описания буферов такие:
Далее в OnInit:
По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).
Двухцветность за счет способа рисования DRAW_COLOR_LINE.
Теперь вопрос: первая линия (буфера 2 и 3 в коде выше) прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit;
Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная.вторая линия почему-то выпендривается: например явно не срабатывает строка:
Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?
Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....
И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?
Добрый день.
Столкнулся с некоторой странностью при написании индикатора на MQL5 (индикатор в отдельном подокне, 4 линии).
Начальные описания буферов такие:
Далее в OnInit:
По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).
Двухцветность за счет способа рисования DRAW_COLOR_LINE.
Теперь вопрос: первая линия (буфера 2 и 3 в коде выше) прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit;
Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная.вторая линия почему-то выпендривается: например явно не срабатывает строка:
Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?
Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....
И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?
Нумерация отображений отличается от нумерации буферов.
так должно сработать.
Всем добрый день!
Сделал функцию модификации стоплосса. Но при работе выдает EURUSD,H1: OrderModify error 130.
Причем цена далеко от того места куда должен встать стоплосс.
вот сама функция:
void open_bu(string walpa, int op) { bool err; int spred=(int)MarketInfo(walpa,MODE_SPREAD); double point=MarketInfo(walpa,MODE_POINT); int digits=(int)MarketInfo(walpa,MODE_DIGITS); for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa) { if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) ) { err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0)) { Print(walpa," ",spred," ",point," ",digits," ",NormalizeDouble(OrderOpenPrice()-spred*point, digits)); err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } } } return; }Написал функцию для нахождения номера бара фрактала из 3х баров. На онлайн графике вроде определяет правильно. А при визуальном тестировании в тестере врёт. Может кто-нибудь из профессионалов, глянув на код, обнаружит какие-нибудь огрехи?
Буду премного благодарен.
Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)
Здравствуйте!
в цикле закрытии ордеров хотел поставить услвие на день открытия ордера, чтобы те которые в пятницу открылись не закрывались. но почему то цикл не идет..
Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)
Тебе не в OnInit надо писать данный код, а в OnTick().
Здравствуйте!
в цикле закрытии ордеров хотел поставить услвие на день открытия ордера, чтобы те которые в пятницу открылись не закрывались. но почему то цикл не идет..
Попробуйте так:
for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) { if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print("NoMagic ", OrderMagicNumber()); // for Debug } else Print( "Error when order select ", GetLastError()); }