코딩 도움말 - 페이지 557

 
mntiwana:
친애하는 MLADEN,

내 이전 요청이 실수로 삭제되었을 수 있습니다. 대부분 여기 저기에서 실행되고 정확한 위치를 찾고 조정하지만 우리는 쉽고 편안하게 작업을 수행할 수 있습니다. 알림으로 추가하려는 BE 코드로 간단한 후행 중지를 요청합니다. 귀하의 친절한 도움과 안내로 변경한 첨부된 EA에 /merge하지만 급하지 않습니다. 가능하면 얼마나 많은 정보가 퍼져서 귀하를 기다리고 있는지 알고 있습니다. 감사합니다.

문안 인사

simple_ma_cross_eamod-hp.mq4

확인. 완료됩니다

 
 

안녕하세요 여러분,

내 게시물을 읽어 주셔서 감사합니다. 나는 코드에 관해서는 절대 초보자입니다. 나는 이 EA를 작동시키기 위해 몇 가지를 시도했지만 그것들은 답이 아니었다. 새로 고침/다시 로드 등이 발생했을 때 다시 시작하는 대신 발생한 일을 기억하기 위해 이것이 필요하다고 생각하기 때문에 전역 변수를 연구하고 있습니다. 백테스트에서는 완벽하게 작동하지만 라이브를 실행할 때 어떤 이유로 인해 거래를 중단하거나 문제에 대해 거래를 종료할 수 있으며 이해할 수 없습니다. 저도 이런 일을 하는 방법을 배우려고 노력하고 있지만 이제 막 시작하기 때문에 잘못된 방식으로 일을 하는 것을 용서하십시오. EA에는 시작 및 중지 시간이 있으며 그 시간에 x개의 거래를 열 수 있으며 이것이 닫히면 사이클이 완료됩니다. 기간당 1사이클만 허용하도록 설정됩니다.

누군가 이 코드를 보고 문제가 무엇인지 확인할 수 있습니까? 도움을 주셔서 감사합니다.

마1

quantum_shaolin_1.3.2.mq4

양자.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/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/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[]이 비어 있으므로 이것은 의미가 없습니다.

마지막으로 주제에서 벗어난 이야기를 하고 싶습니다. 과거에는 여러 기호를 연속적으로 스캔하는 스캐너 표시기에 대해 질문했습니다. 현재 기호가 자주 업데이트되지 않는 차트에 표시기가 첨부될 때 더 자주 변경되는 기호의 모든 눈금이 표시되지 않는지 궁금합니다(초당 눈금이 적음). 그것은 이론적으로 표시기가 여전히 20:05의 5분 막대에 있는 반면 스캔해야 하는 더 빠른 업데이트 기호는 이미 20:10에 있음을 의미합니다. 새 막대가 20:04:59 이후의 첫 번째 눈금에서 시작되고 시계가 20:05:00에 도달할 때는 시작되지 않기 때문입니다. 새로운 메타트레이더 버전에서는 시작 {return} 절차가 더 이상 각 새 틱에서 활성화되지 않기 때문에 모든 기호가 고정된 검사 속도로 검사될 것이라고 응답했습니다. 대신 고정 비율로 활성화됩니다. 이것은 사실이 아닌 것으로 밝혀졌습니다. 내 모든 표시기를 내 스캐너 표시기 자체의 코드에 포함된 기능으로 바꾼 후에도 전체 표시기는 여전히 mt4를 실행했을 때 멈췄습니다. 따라서 iCustom()을 사용하여 코드를 호출하거나 코드를 삽입하고 이를 내부 함수로 전환하면 아무런 차이가 없으며 여전히 정지됩니다. 그러나 나는 215회 반복의 긴 마스터 for 루프를 버리고(각 반복마다 symbol[y]에서 다른 기호가 처리됨) 이를 각 틱 후에 추가를 가져오는 변수로 대체하여 이에 대한 해결책을 찾았습니다. 저는 이것을 사용하여 컴퓨터에 어떤 기호를 사용해야 하는지 알려줍니다. 이제 모든 틱 에서 216개의 모든 기호를 분석하려고 하는 대신(전체가 정지됨) 각 틱에서 하나의 기호만 분석됩니다. 추가 변수가 215에 도달하면 0으로 재설정되고 전체 216 주기가 다시 시작됩니다. 이제 모든 기호가 모든 틱에서 216개 모두를 분석했을 때보다 약간 느리지만 모든 기호가 분석되고 있습니다. 요점은{} 차트의 현재 기호가 업데이트될 때만 시작이 활성화된다는 것입니다. 이는 지표가 매우 활동적인 기호(예: EURUSD)와 달리 덜 활동적인 기호(예: 주식)일 때 모든 216개 기호를 통과하는 데 시간이 더 오래 걸린다는 것을 의미합니다. 따라서 시작{}은 여전히 각각의 새 틱에서 활성화됩니다.

파일:
 

안녕하세요, Mladen과 Mrtools, 대단히 기쁘게 생각합니다.

첨부된 인디케이터를 컴파일하면서 2가지 오류가 발생하는 문제를 해결하는 것이 좋을 것입니다.

미리 감사합니다

모레노

추신: 내 영어를 유감스럽게 생각합니다 :-)

파일:
 
morenokosta:
안녕하세요, Mladen과 Mrtools, 대단히 기쁘게 생각합니다.

첨부된 인디케이터를 컴파일하면서 2가지 오류가 발생하는 문제를 해결하는 것이 좋을 것입니다.

미리 감사합니다

모레노

추신: 내 영어를 유감스럽게 생각합니다 :-)

모레노코스타

그 지표는 우리를 그대로 OK

코드를 변경할 필요가 없습니다.

 

안녕 믈라덴

이 표시기 에 경고를 추가 할 수 있습니까? 저는 초보자입니다.

감사합니다

파일:
cross.mq4  2 kb