Помощь в кодировании - страница 557

 
mntiwana:
Дорогой МЛАДЕН,

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

с уважением

simple_ma_cross_eamod-hp.mq4

OK. Будет сделано

 
 

Привет всем,

Спасибо, что нашли время прочитать мой пост. Я абсолютный новичок, когда дело доходит до кода. Я попробовал пару вещей, чтобы заставить советника работать, но они не помогли. Я изучаю глобальные переменные, так как думаю, что они нужны для запоминания того, что произошло, а не для перезапуска при обновлении/перезагрузке и т.д. Он отлично работает в бэктесте, но по какой-то причине при работе в реальном времени он просто перестает принимать сделки или закрывать их, и я просто не могу понять это. Я также пытаюсь научиться делать эти вещи, но я только начинаю, поэтому простите меня, если я делаю что-то не так. У советника есть время старта и остановки, и за это время он может открыть x сделок, и когда они закрываются, цикл завершается. Он настроен на то, чтобы разрешить только 1 цикл за период времени.

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

маа1

quantum_shaolin_1.3.2.mq4

quantum.mq4

Файлы:
 

Здравствуйте, Младен,

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

Проблема в том, что индикатор говорит, что индикаторы всегда есть, даже когда на самом деле их нет. Когда это так, количество индикаторов всегда равно одному и тому же числу.

Пожалуйста, посмотрите на код ниже:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Когда все отображается в оповещении, я получаю что-то вроде EURUSD: 15m/60m/4u/1d/1w/1mo указывает на возможность покупки 7/7/7/7/7/7/.

Это означает, что он суммирует 7 индикаторов для каждого таймфрейма, что явно ошибочно. Он даже утверждает это, когда я убираю все вызовы функций. Когда я делаю это, все элементы BufferALL[] оказываются пустыми.

Но, очевидно, значение EMPTY все еще является значением, которое можно сравнить с другим значением, например, 534653647457. Когда я использую сравнение >= или = 534653647457, чтобы == 534653647457, сообщения /7/7/7/7/7/7 прекращаются. Как я могу это исправить?

 
mrcodix:
Здравствуйте, Младен,

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

Проблема в том, что индикатор говорит, что индикаторы всегда есть, даже если на самом деле их нет. Когда это так, количество индикаторов всегда равно одному и тому же числу.

Пожалуйста, посмотрите на код ниже:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Когда все отображается в оповещении, я получаю что-то вроде EURUSD: 15m/60m/4u/1d/1w/1mo указывает на возможность покупки 7/7/7/7/7/7/.

Это означает, что он суммирует 7 индикаторов для каждого таймфрейма, что явно ошибочно. Он даже утверждает это, когда я убираю все вызовы функций. Когда я это делаю, все элементы BufferALL[] оказываются пустыми.

Но, очевидно, значение EMPTY все еще является значением, которое можно сравнить с другим значением, например, 534653647457. Когда я использую сравнение >= или = 534653647457, чтобы == 534653647457, сообщения /7/7/7/7/7/7 прекращаются. Как я могу это исправить?

mrcodix

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

 
mladen:

mrcodix

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

Уважаемый Младен,

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

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}[/CODE]

it might aswell be something like

for(z=0; z<=14; z++){

if (BufferALL[z] >=1111111111111) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=2222222222222) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 333333333333) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 444444444444) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

it will give the same exact alert message that says /15m/60m/4u/1d/1w/1mo/ is indicating a buying opportunity /7/7/7/7/7/7/. I disabled all the function call lines with // so the BufferALL[22] elements should be EMPTY, they shoulden't contain any value whatsoever. Yet, when the computer comes at the if condition parts BufferALL[z] >=1111111111111 etc it ALWAYS states that the "value" thats inside BufferALL[z] is larger then 11111111111 (or any value you wish to put behind it). The only way to make these additions stop is by changing the if condition = into ==. When the computer asks whether the empty value of BufferALL[z] is exactly the same as 11111111 or 22222 or whatever value you wish to compare, it doesen't return a true and Timeframe is not added with +1. Please try it for youself. I will add the message construction code below:

[CODE]

int SymbolBars[216][7];

if (((Timeframe[0][1] > 0) && (Timeframe[1][1] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][1] > 0) && (Timeframe[2][1] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][1] > 0) && (Timeframe[3][1] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][1] > 0) && (Timeframe[4][1] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][1] > 0) && (Timeframe[5][1] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][1]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][1],"/"));

SymbolBars[y][0]=iBars(symbol[y],15);

}

if (Timeframe[1][1]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][1],"/"));

SymbolBars[y][1]=iBars(symbol[y],60);

}

if (Timeframe[2][1]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][1],"/"));

SymbolBars[y][2]=iBars(symbol[y],240);

}

if (Timeframe[3][1]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][1],"/"));

SymbolBars[y][3]=iBars(symbol[y],1440);

}

if (Timeframe[4][1]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][1],"/"));

SymbolBars[y][4]=iBars(symbol[y],10080);

}

if (Timeframe[5][1]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][1],"/"));

SymbolBars[y][5]=iBars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a selling opportunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}

if (((Timeframe[0][2] > 0) && (Timeframe[1][2] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][2] > 0) && (Timeframe[2][2] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][2] > 0) && (Timeframe[3][2] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][2] > 0) && (Timeframe[4][2] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][2] > 0) && (Timeframe[5][2] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][2]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][2],"/"));

SymbolBars[y][0]=Bars(symbol[y],15);

}

if (Timeframe[1][2]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][2],"/"));

SymbolBars[y][1]=Bars(symbol[y],60);

}

if (Timeframe[2][2]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][2],"/"));

SymbolBars[y][2]=Bars(symbol[y],240);

}

if (Timeframe[3][2]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][2],"/"));

SymbolBars[y][3]=Bars(symbol[y],1440);

}

if (Timeframe[4][2]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][2],"/"));

SymbolBars[y][4]=Bars(symbol[y],10080);

}

if (Timeframe[5][2]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][2],"/"));

SymbolBars[y][5]=Bars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a buying oppertunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}
 

Младен,

Вот пример непрерывного оповещения, когда я удаляю все звонки индикаторов, превращая их в строки комментариев.

Когда есть возможность покупки, сумма всех индикаторов на всех возможных таймфреймах равна 15. При возможности продажи - 7. BufferALL[] - EMPTY, так что это не имеет никакого смысла.

Наконец, я хотел бы упомянуть вам кое-что не по теме. В прошлом я спрашивал о том, как индикатор сканер сканирует несколько символов последовательно. Я задавался вопросом, не получит ли он все тики на более часто меняющихся символах, если индикатор прикреплен к графику, на котором текущий символ обновляется не так часто (меньше тиков в секунду). Это означает, что теоретически индикатор все еще находится на 5-минутном баре в 20:05, в то время как более быстро обновляющиеся символы, которые он также должен сканировать, уже находятся в 20:10. Просто потому, что новый бар начинается на первом тике после 20:04:59, а не когда часы бьют 20:05:00. Вы ответили на это, сказав, что все символы будут проверяться с фиксированной скоростью проверки, потому что в новой версии metatrader процедура start {return} больше не активируется на каждом новом тике. Вместо этого она активируется с фиксированной скоростью. Оказалось, что это не так. После превращения всех моих индикаторов в функции, включенные в код самого индикатора-сканера, весь индикатор все еще заставлял mt4 зависать, когда я запускал его. То есть использование iCustom() для вызова кода или вставка кода и превращение его во внутреннюю функцию ничего не меняет, он все равно зависает. Но я нашел решение этой проблемы, отказавшись от длинного главного цикла for с 215 итерациями (каждую итерацию обрабатывается другой символ из symbol[y]) и заменив его переменной, которая получает добавление после каждого тика. Я использую ее, чтобы сообщить компьютеру, какой символ он должен использовать, так что теперь вместо того, чтобы пытаться анализировать все 216 символов на каждом тике (что приводит к зависанию всего процесса), на каждом тике анализируется только один символ. Когда переменная сложения достигает значения 215, она сбрасывается обратно в 0, и весь цикл 216 начинается заново. Теперь все символы анализируются, хотя и немного медленнее, чем если бы они анализировались все 216 на каждом тике (если бы, конечно, все не замерло) ..... В любом случае. Дело в том, что Start{} активируется только тогда, когда текущий символ на графике обновляется. Это означает, что требуется больше времени, чтобы просмотреть все 216 символов, когда индикатор является менее активным символом (например, акция) по сравнению с очень активным символом (например, EURUSD). Поэтому Start{} по-прежнему активируется на каждом новом тике.

Файлы:
 

Здравствуйте Mladen и Mrtools, с большим удовольствием обращаюсь.

Было бы любезно решить проблему двух ошибок при компиляции прилагаемого индикатора.

Заранее спасибо

Moreno

PS: Прошу прощения за мой английский :-)

Файлы:
 
morenokosta:
Здравствуйте Mladen и Mrtools, я спрашиваю с большим удовольствием.

Хотелось бы решить проблему с двумя ошибками при компиляции прилагаемого индикатора.

Заранее спасибо

Морено

PS: Извините за мой английский :-)

morenokosta

Этот индикатор работает нормально как есть.

Нет необходимости вносить какие-либо изменения в код

 

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

Не могли бы вы добавить алерт на этот индикатор, я новичок.

Спасибо

Файлы:
cross.mq4  2 kb
Причина обращения: