코딩하는 방법? - 페이지 297

 

...

테런스

닫힌 막대에서 십자가를 테스트하고 싶었습니다. Shift 1은 첫 번째 닫힌 막대를 의미하고 Shift 2는 그 이전의 첫 번째 막대를 의미합니다. 그리고 닫힌 막대에서 십자가를 테스트하려면 테스트해야 하는 막대입니다.

(diff1*diff2)<0) 현재 : 실제로는 매우 간단합니다.

diff1은 막대 1에 있는 2개의 평균 간의 차이입니다.

diff2는 막대 2에 있는 2개의 평균 간의 차이입니다.

모두 양수 또는 음수일 수 있습니다. 우리가 관심을 갖는 것은 하나는 양수이고 다른 하나는 음수일 때입니다. 이는 평균이 교차했음을 의미하기 때문입니다. 그것들을 곱하면 십자가가 있는 경우 빠른 답을 얻을 수 있습니다(기호가 다르면 결과는 0보다 작음, 부호가 같으면 해당 곱의 결과는 0보다 큼)

이 코드가 수행하는 작업이 명확해졌기를 바랍니다.

tkuan77:
안녕 Mladen, 나는 당신이 나에게 말한 것을 시도했고 그것은 경이롭게 작동합니다. 그러나 나는 코드 뒤에 있는 논리를 잘 이해하지 못합니다. 왜 iMA의 시프트를 1과 2로 설정하고 이것을 코딩합니까: (diff1*diff2)<0)도 마찬가지입니까? 죄송하지만 저는 현재 여전히 학습 문구에 있습니다.

감사합니다

테런스
 

화살표를 추가하는 방법

첨부된 것은 지난 몇 개의 게시물에서 논의된 MA 크로스오버 EA의 축약된 버전입니다.

닫힌 양초에서 크로스오버가 발생하면 이 버전 로그 파일에 메시지를 인쇄합니다.

차트에 위/아래 화살표를 표시하는 코드로 인쇄 논리를 대체할 수 있습니까?

도와주셔서 감사합니다.

파일:
 

...

이 방법을 시도하십시오 ...

화살표가 그려지고 차트의 오른쪽 하단 모서리에 주석이 표시됩니다. 다음과 같습니다(차트에 평균을 추가하여 수행하는 작업을 명확하게 하기 위함).

michaelB:
첨부된 것은 지난 몇 개의 게시물에서 논의된 MA 크로스오버 EA의 축약된 버전입니다.

닫힌 양초에서 크로스오버가 발생하면 이 버전 로그 파일에 메시지를 인쇄합니다.

차트에 위/아래 화살표를 표시하는 코드로 인쇄 논리를 대체할 수 있습니까?

도와주셔서 감사합니다.
 

MA 화살표

"2MAcrossover with comment"는 정말 잘 작동합니다.

한 가지 질문입니다. 화살표가 나타나면 새 양초가 열리면 사라집니다. 의도한 것입니까?

차트의 오른쪽 하단에 있는 댓글이 마음에 듭니다.

다시 한번 감사합니다.

 
mladen:
테런스

닫힌 막대에서 십자가를 테스트하고 싶었습니다. Shift 1은 첫 번째 닫힌 막대를 의미하고 Shift 2는 그 이전의 첫 번째 막대를 의미합니다. 그리고 닫힌 막대에서 십자가를 테스트하려면 테스트해야 하는 막대입니다.

(diff1*diff2)<0) 현재 : 실제로는 매우 간단합니다.

diff1은 막대 1에 있는 2개의 평균 간의 차이입니다.

diff2는 막대 2에 있는 2개의 평균 간의 차이입니다.

모두 양수 또는 음수일 수 있습니다. 우리가 관심을 갖는 것은 하나는 양수이고 다른 하나는 음수일 때입니다. 이는 평균이 교차했음을 의미하기 때문입니다. 그것들을 곱하면 십자가가 있는 경우 빠른 답을 얻을 수 있습니다(기호가 다르면 결과는 0보다 작음, 부호가 같으면 해당 곱의 결과는 0보다 큼)

이 코드가 수행하는 작업이 명확해졌기를 바랍니다.

도움을 주신 Mladen에게 감사드립니다! 그러나 그 코드를 추가했을 때 내 EA가 약간 엉망이 된 것 같습니다. 때때로 내 스크린샷에 표시된 것과 같이 실제 SL 또는 TP에 도달하기 전에도 자체적으로 SL 또는 TP를 자동으로 실행합니다. 이게 왜 그래?

감사합니다

테런스

//--- 입력 매개변수

외부 이중 TakeProfit=1000.0;

외부 이중 로트=0.1;

외부 이중 StopLoss=1500.0;

//+----------------------------------------------- -------------------+

//| 전문가 초기화 기능 |

//+----------------------------------------------- -------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

//+----------------------------------------------- -------------------+

//| 전문가 초기화 해제 기능 |

//+----------------------------------------------- -------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

int mainCrossed (이중 mainline1 , 이중 mainline2)

{

정적 int mainlast_direction = 0;

정적 int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; // 메인 업

if(mainline1<mainline2)maincurrent_dirction = 2; //메인다운

if(maincurrent_dirction != mainlast_direction) //메인 변경됨

{

mainlast_direction = maincurrent_dirction;

반환(mainlast_direction);

}

또 다른

{

리턴(0);

}

}

//+----------------------------------------------- -------------------+

//| 전문가 시작 기능 |

//+----------------------------------------------- -------------------+

정수 시작()

{

//----

int cnt, 티켓, 합계;

이중 shortEma, longEma, mainshortEma, mainlongEma;

if(막대<100)

{

Print("100개 미만의 막대");

리턴(0);

}

if(테이크프로핏<10)

{

Print("TakeProfit이 10 미만입니다.");

리턴(0); // TakeProfit 확인

}

정수 isCrossed = 0;

이중 shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

더블 longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

이중 shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

더블 longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

이중 diff1 = shortEma1-longEma1;

이중 diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed(mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

그렇지 않으면 isCrossed = 2;

}

총계 = OrdersTotal();

if(총 < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print(" SELL 주문 이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

리턴(0);

}

리턴(0);

}

리턴(0);

}

//+----------------------------------------------- -------------------+

파일:
ps.jpg  16 kb
 

테런스

그 코드는 SL 또는 TP와 아무 관련이 없습니다. 그것은 단순히 십자가에 대한 2개의 평균을 테스트합니다(michaelB도 nan EA이기 때문에 2MACrosses에서 동일한 코드를 사용한 방법 참조). 나머지 코드는 해당 SL 및 TP 오류에 대해 수정해야 합니다.

tkuan77:
도움을 주신 Mladen에게 감사드립니다! 그러나 그 코드를 추가했을 때 내 EA가 약간 엉망이 된 것 같습니다. 때때로 내 스크린샷에 표시된 것과 같이 실제 SL 또는 TP에 도달하기 전에도 자체적으로 SL 또는 TP를 자동으로 실행합니다. 이게 왜 그래?

감사합니다

테런스

//--- 입력 매개변수

외부 이중 TakeProfit=1000.0;

외부 이중 로트=0.1;

외부 이중 StopLoss=1500.0;

//+----------------------------------------------- -------------------+

//| 전문가 초기화 기능 |

//+----------------------------------------------- -------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

//+----------------------------------------------- -------------------+

//| 전문가 초기화 해제 기능 |

//+----------------------------------------------- -------------------+

정수 초기화()

{

//----

//----

리턴(0);

}

int mainCrossed (이중 mainline1 , 이중 mainline2)

{

정적 int mainlast_direction = 0;

정적 int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; // 메인 업

if(mainline1<mainline2)maincurrent_dirction = 2; //메인다운

if(maincurrent_dirction != mainlast_direction) //메인 변경됨

{

mainlast_direction = maincurrent_dirction;

반환(mainlast_direction);

}

또 다른

{

리턴(0);

}

}

//+----------------------------------------------- -------------------+

//| 전문가 시작 기능 |

//+----------------------------------------------- -------------------+

정수 시작()

{

//----

int cnt, 티켓, 합계;

이중 shortEma, longEma, mainshortEma, mainlongEma;

if(막대<100)

{

Print("100개 미만의 막대");

리턴(0);

}

if(테이크프로핏<10)

{

Print("TakeProfit이 10 미만입니다.");

리턴(0); // TakeProfit 확인

}

int isCrossed = 0;

이중 shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

더블 longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

이중 shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

더블 longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

이중 diff1 = shortEma1-longEma1;

이중 diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed(mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

그렇지 않으면 isCrossed = 2;

}

총계 = OrdersTotal();

if(총 < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("판매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

리턴(0);

}

리턴(0);

}

리턴(0);

}

//+----------------------------------------------- -------------------+
 

...

네, 의도적입니다.

지표가 아닌 EA를 만드셨기 때문에 마지막 활성 십자가만 표시하고 활성 십자가가 없을 때 화살표를 표시하지 않도록 추가되었습니다. 여러 개의 화살표를 표시할 수 있게 하려면 먼저 지표로 변환한 다음 전체를 다시 작성해야 하지만 차트에 이미 평균 십자형을 표시하는 지표가 많이 있다고 생각합니다.

michaelB:
"2MAcrossover with comment"는 정말 잘 작동합니다.

한 가지 질문입니다. 화살표가 나타나면 새 양초가 열리면 사라집니다. 의도한 것입니까?

차트 오른쪽 하단에 있는 댓글이 마음에 듭니다.

다시 한번 감사합니다.
 
mladen:
Terrance 그 코드는 SL 또는 TP와 관련이 없습니다. 그것은 단순히 십자가에 대한 2개의 평균을 테스트합니다(michaelB도 nan EA이기 때문에 2MACrosses에서 동일한 코드를 어떻게 사용했는지 참조). 나머지 코드는 해당 SL 및 TP 오류에 대해 수정해야 합니다.

안녕 믈라덴

내가 TP와 SL을 설정하는 방식이 잘못되었다는 뜻인가요?

문안 인사

테런스

 

...

테런스

TSD: Lessons 의 이 섹션을 보셨습니까?

이미 많은 질문에 대한 답변이 있고 일반적인 EA 작성에 대한 매우 좋은 예를 찾을 수 있다고 생각합니다. 귀하의 질문에 대해 : 귀하의 EA를 테스트하지 않았으므로 모르겠습니다. 다른 사람의 EA를 테스트할 때의 문제는 그 아이디어와 논리를 알아야 하고 코드 자체에서 "읽기"가 불가능한 경우가 많다는 것입니다. 우리가 이야기한 코드 조각은 닫힌 막대에서 2개의 평균 교차를 감지하는 방법에 관한 것이며 그 코드는 그 일을 하고 있을 뿐입니다. 그래서 "SL이나 TP와는 아무 상관이 없다"고 말한 것입니다.

문안 인사

믈라덴

tkuan77:
안녕 믈라덴

내가 TP와 SL을 설정하는 방식이 잘못되었다는 뜻인가요?

문안 인사

테런스
 

MQL 수업 스레드

mladen-- 링크 주셔서 감사합니다!!

사유: