Как кодировать? - страница 322

 

Здравствуйте,

Моя просьба пока только для информации.

Если у меня есть индикатор, который создает автономный график без расчета прошлого, а только живые данные, можно ли его прикрепить в шаблоне тестера стратегий и создать автономный график с данными из истории?

Спасибо.

 
mladen:
jayjonbeach,

Вы проверяете значение trendCurr снова и снова в цикле, не изменяя его (поэтому оно всегда будет возвращать NONE).

Попробуйте поместить iCustom() в цикл, а затем протестировать это значение. Что-то вроде этого:

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Уважаемый сэр. У меня есть только два слова по этому поводу, но их стоит повторить...

СПАСИБО ВАМ, СПАСИБО ВАМ и СПАСИБО ВАМ!!!

Действительно, ваш код работает идеально, и я готов поспорить, что вы сэкономили мне еще 12 или много часов изучения других циклов "for", проб и ошибок и т.д., прежде чем я наконец наткнулся на то, что вы написали.

Я действительно думал, что хотел проверить trendCurr снова и снова в цикле, но теперь я вижу ошибку благодаря вам, и я вижу, что ваше решение по замене Stepbartotest на "i" действительно является идеальным решением, использование "i" здесь действительно является ключевым, но не кажется совершенно очевидным, по крайней мере, для новичка, как я, могло пройти некоторое время, прежде чем я понял это...

В то время как ваш код сработал так, как было задумано, весь мой блок - нет, есть очень интересный непредвиденный результат того, что этот цикл выполняется внутри критерия LONG:

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) // проверяем текущий Step filter

{

if (Bid > TwentyOneEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

}

}

Что происходит сейчас, так это то, что когда встречаются ifs, цикл тестируется и если true, то он покупает, если нет, то ничего не делает, отлично. Однако весь блок кода действует как цикл "while", поскольку пока if(TwentyOneEMA > FiftyFiveEMA) истинно, остальная часть кода под ним продолжает работать, и если все остальные условия становятся истинными, лох покупает! Я вижу очевидную ошибку в структуре моего кода здесь..... (Я думаю, что еще один подобный цикл for мог бы проверить EMA, чтобы убедиться, что пересечение EMA является НОВЫМ).

Однако это не обязательно плохо (как предполагает некоторый анализ), на самом деле это похоже на то, что было моей следующей целью, в другом смысле, это требует гораздо большего тестирования, но пока я собираюсь оставить эту ревизию на месте на этом боте и начать следующие ревизии на копии.

То, что я собирался сделать после того, как я заставил его смотреть на прошлое, это если прошлый цикл окажется ложным, я хотел, чтобы он проверил следующие 10 баров на наличие сигнала Step, и если он станет истинным, то совершил сделку (я думал об использовании цикла while для этого?). Так что это вроде как уже происходит, только нет ограничения в 10 баров, и я не уверен, как я должен структурировать все это, чтобы работать правильно. (Я думаю, я мог бы проверить сигнал Step, и если он верен, искать новое пересечение MA в последние 10 баров, но я должен повторить весь блок для этого и думаю, что должен быть лучший более эффективный/элегантны способ).

Еще раз спасибо за помощь, это будет ОЧЕНЬ полезно в будущем кодировании, я уверен.

 

Здравствуйте,

Я пытаюсь модифицировать прилагаемый индикатор. Практически, когда скользящее среднее касается цены, он подает сигнал тревоги и меняет таймфрейм, на котором он коснулся. Я установил задержку в сигнализации, которая соблюдается, но после сигнализации, если я меняю таймфрейм, он игнорирует ее.

Это можно исправить?

Спасибоmedie_mobili.mq4

Файлы:
 

dasio

С индикаторами вы не можете изменить это. Индикаторы сбрасывают глобальную область видимости и статические переменные в значения по умолчанию, когда вы делаете это, поэтому вы не можете сохранить некоторые значения при смене таймфрейма или символа. Вы можете использовать глобальные переменные (те, которые управляются функциями "GlobalVariable..."), но это сделает ваш код очень сложным (для нескольких таймфреймов, нескольких символов, ...) и, на мой взгляд, это не стоит усилий.

dasio:
Привет,

Я пытаюсь модифицировать прилагаемый индикатор. Практически, когда скользящее среднее касается цены, он подает сигнал тревоги и меняет таймфрейм, на котором произошло касание. Я установил задержку в сигнале тревоги, что вызывает уважение, но после сигнала тревоги, если я меняю таймфрейм, он игнорирует его.

Это можно исправить?

Спасибоmedie_mobili.mq4
 

...

Просто одно дополнение к предыдущему сообщению: одна вещь, которая не так широко известна - советники обращаются с этими переменными (глобальная область видимости и статические переменные) по-другому - они не сбрасываются при смене таймфрейма или символа. Вот очень, очень простой советник, который покажет тем, кто заинтересован в этом, как эти значения не сбрасываются в советниках, как в индикаторах.

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Это даже является причиной некоторых ошибок в некоторых советниках (если советник не учитывает, что переменная не будет сброшена при смене таймфрейма или символа, могут возникнуть очень странные ошибки в работе советника).

 
mladen:
dasio Из кода я не могу понять, каково намерение кода. В любом случае, вот код, в котором вы можете выбрать, хотите ли вы использовать истинный диапазон в качестве "основного" значения индикатора (это первая часть вашего кода) или вы хотите использовать вторую часть вашего кода в качестве "основного" значения

Еще раз спасибо mladen.

Можно ли добавить еще одну линию на основе этого условия?

Нарисовать горизонтальную линию = к среднему значению Work[], которые > Avg[] всегда на основе периода дней?

Спасибо

 

Поправка к сигналу

Привет Младен,

Я хочу добавить сигнал стоп продажи или стоп покупки в этот код.....e.g если стохастическая сигнальная линия находится над основной, стоп продажи e.t.c, я добавил это в код, но он не работает...pls помощь

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// предупреждения

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Стрелка на покупку","\n","Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Стрелка на продажу","\n", "Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

}

}

 

Вы можете попробовать что-то вроде этого:

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Привет, Младен,

Я хочу добавить сигнал стоп продажи или стоп покупки в этот код.....e.g если стохастическая сигнальная линия находится над основной, стоп продажи e.t.c, я добавил это в код, но он не работает...pls help

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// предупреждения

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Стрелка на покупку","\n", "Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Стрелка на продажу","\n", "Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

}

}
 

Я снова застрял. Я пытаюсь исправить советника от заглядывания в будущее из-за того, как был структурирован мой код.

Мой сигнальный код начинается с "if", и пока это верно, остальной код, следующий за ним, продолжает выполняться, как и должен (это не было проблемой до вставки первого цикла for, но теперь это проблема). Я перепробовал кучу разных способов исправить это, но ничего не помогает Я также проверил руководство, но там ничего не было сказано, может быть, два цикла "for" в одном блоке недопустимы?

Вот, что я думаю, это моя лучшая попытка (просто показываю LONG для краткости), ошибок нет, но советник не совершает сделок, так что, вероятно, я снова испортил цикл:

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // фильтр новостей

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Обратите внимание, я попробовал if (testValue1 < testValue2-Separation2) continue; но он пометил 'continue' как ошибку Если 2 цикла не разрешены, то я думаю, что моя следующая задача по добавлению еще одного цикла может быть ошибочной...

 
jayjonbeach:
Я снова застрял. Я пытаюсь исправить советника, чтобы он не смотрел в будущее из-за того, как был структурирован мой код.

Мой сигнальный код начинается с "if", и пока это истинно, остальной код, следующий за ним, продолжает выполняться, как и должен (это не было проблемой до вставки первого цикла for, но теперь стало проблемой). Я перепробовал кучу разных способов исправить это, но ничего не помогает Я также проверил руководство, но там ничего не было сказано, может быть, два цикла "for" в одном блоке недопустимы?

Вот, что я думаю, это моя лучшая попытка (просто показываю LONG для краткости), ошибок нет, но советник не совершает сделок, так что, вероятно, я снова испортил цикл:

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // фильтр новостей

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Обратите внимание, я пробовал if (testValue1 < testValue2-Separation2) continue; но он пометил 'continue' как ошибку Если 2 цикла не разрешены, то я думаю, что моя следующая задача по добавлению еще одного цикла может быть ошибочной...

Думаю, я понял, что дело в том, как я структурировал цикл for, потому что вещи не собирались "заканчиваться" непосредственно после этого первого цикла, он должен быть структурирован немного иначе, чем второй цикл, по крайней мере, к такому выводу я пришел, посмотрев на некоторых других ботов. Быстрый тест показывает, что следующее работает, хотя нужно провести больше тестов.

NumOrders = CalculateCurrentOrders();

if (NumOrders == 0)

{

if (TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 <! testValue2-Separation2)

{

Print("No Trade");

break;

}

if (Bid TwentyOneEMA) continue; // фильтр новостей

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

Причина обращения: