FastMA_after = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i-1); и
SlowMA_after = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i-1);
при i=0 нет значений, значит
FastMA_after > SlowMA_after или FastMA_after < SlowMA_after никогда не выполнятся.
Убрал все, что связано с
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.
SlowMA_after и FastMA_afterВсё равно не торгует.
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.
andro_id >>:
Убрал все, что связано с
Всё равно не торгует.
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.
Убрал все, что связано с
Всё равно не торгует.
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.
Какой индикатор? какие стрелочки? вот с этого места поподробнее
А вот индикатор:
#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 OrangeRed //---- input parameters extern int FastMA = 7; extern int FastMetod = 1; //0=SMA, 1=EMA, 2=SMMA, 3=LWMA extern int FastType = 5; //CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6 extern int SlowMA = 15; extern int SlowMetod = 1; //0=SMA, 1=EMA, 2=SMMA, 3=LWMA extern int SlowType = 5; //CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6 extern string ExtSoundFileName = ""; //---- buffers double CrossUp[]; double CrossDown[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_ARROW, EMPTY); SetIndexArrow(0, 233); SetIndexBuffer(0, CrossUp); SetIndexStyle(1, DRAW_ARROW, EMPTY); SetIndexArrow(1, 234); SetIndexBuffer(1, CrossDown); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int limit, i, counter; double FastMA_now, SlowMA_now, FastMA_previous, SlowMA_previous, FastMA_after, SlowMA_after; double Range, AvgRange; string message; int counted_bars = IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit = Bars-counted_bars; for(i = 0; i <= limit; i++) { counter = i; Range = 0; AvgRange = 0; for (counter = i ;counter <= i+9; counter++) { AvgRange = AvgRange+MathAbs(High[counter]-Low[counter]); } Range = AvgRange/10; //---- FastMA_now = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i); FastMA_previous = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i+1); FastMA_after = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i-1); SlowMA_now = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i); SlowMA_previous = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i+1); SlowMA_after = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i-1); if ((FastMA_now > SlowMA_now) && (FastMA_previous < SlowMA_previous) && (FastMA_after > SlowMA_after)) { CrossUp[i] = Low[i] - Range*0.5; //message = StringConcatenate(Symbol()," MA 7 пересекла MA 15 вверх в ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid,"."); //Alert(message); if ( ExtSoundFileName != "" ) PlaySound( ExtSoundFileName ); } else if ((FastMA_now < SlowMA_now) && (FastMA_previous > SlowMA_previous) && (FastMA_after < SlowMA_after)) { CrossDown[i] = High[i] + Range*0.5; //message = StringConcatenate(Symbol()," MA 7 пересекла MA 15 вниз в ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid,"."); //Alert(message); if ( ExtSoundFileName != "" ) PlaySound( ExtSoundFileName ); } } //---- return(0); }
Ну а он то здесь при чем?
Смотрите журнал тестера... Запустите в визуальном режиме и наблюдайте... Когда, по идее должна быть покупка/продажа - смотрите внимательнее.
И ищите алгоритмические ошибки... Я на первый взгляд в вашем коде таких не обнаружил...
Ну конечно не считая вот этого:)
if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);
ну и то же самое для sell...
в таком варианте Алерт у вас наоборот выскочит, когда ордер не открыт... и покажет номер ошибки.
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
Смотрите журнал тестера... Запустите в визуальном режиме и наблюдайте... Когда, по идее должна быть покупка/продажа - смотрите внимательнее.
И ищите алгоритмические ошибки... Я на первый взгляд в вашем коде таких не обнаружил...
Ну конечно не считая вот этого:)
if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);
ну и то же самое для sell...
в таком варианте Алерт у вас наоборот выскочит, когда ордер не открыт... и покажет номер ошибки.
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
lexandros >>:
if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);
ну и то же самое для sell...
в таком варианте Алерт у вас наоборот выскочит, когда ордер не открыт... и покажет номер ошибки.
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);
ну и то же самое для sell...
в таком варианте Алерт у вас наоборот выскочит, когда ордер не открыт... и покажет номер ошибки.
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
Здесь я просто описался, у себя исправил, а тут - нет. В логе тестера ничего нет, кроме записи об инициализации эксперта. Запускаю на отрезке, где ордер как раз и должен сработать, но тест заканчивается с нулевым результатом.
Вот это что if(counted_bars<0) return(-1); уберите
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
lexandros >>:
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
Нет, не совсем так (если бы так, было бы здорово). Из хелпа по OrderSend:
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в
случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо
вызвать функцию GetLastError().
zhuki >>:
Вот это что if(counted_bars<0) return(-1); уберите
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
Спасибо. Убрал это и поставил в расчет последние 3 бара - все заработало. Спасибо большое всем за помощь.
Вот это что if(counted_bars<0) return(-1); уберите
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Код: