MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 248

 
STARIJ :

인터넷이 켜졌습니다! 메일에 쓸 수 있나요?


네, 연락하고 있습니다. 쓰다.

 

조언자를 마무리하는 데 도움이 됩니다. 저는 초보자 프로그래머입니다. 설명:

EA는 EURUSD와 USDCHF의 두 통화 쌍에서 작동하며 10pp의 다이버전스가 있는 경우에만 구매를 위해 두 가지 거래를 엽니다(실제로 이것은 표준 차익 거래자입니다).

조건은 다음과 같습니다. if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))

총 이익/손실이 특정 값에 도달하면 닫힙니다. if ((AccountProfit()>=10)||(AccountProfit()<=-20))


문제의 본질: 항상 2개의 거래를 열지는 않지만 때때로 3개의 거래를 엽니다. 또는 동일한 통화에 대해 두 개의 거래를 엽니다. 다음 사항이 필요합니다: 항상 서로 다른 통화로 2개의 거래를 엽니다(하나는 EURUSD로, 다른 하나는 USDCHF로).



다음은 코드 자체입니다.


외부 이중 임펄스 = 10; // 전역 변수

extern 이중 로트 = 1;


정수 시작()

{

이중 ind2=iClose("EURUSD",PERIOD_M1,0);

이중 ind1=iOpen("EURUSD",PERIOD_M1,0);


이중 ind3=iClose("USDCHF",PERIOD_M1,0);

이중 ind4=iOpen("USDCHF",PERIOD_M1,0);


이중 oper1=ind2-ind1;

더블 EUR=(int)DoubleToStr(oper1*100000,0);


이중 연산자2=ind3-ind4;

doubleCHF=(int)DoubleToStr(oper2*100000,0);


Comment(StringFormat("출력 데이터\nEUR = %G\nCHF =%G",EUR,CHF));

if ((AccountProfit()>=10)||(AccountProfit()<=-20)) // 종료 조건

경고3();

if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point)) // 개방 조건

if (OrdersTotal() == 0)

경고1();

if (OrdersTotal() == 1)

경고2();

리턴(0);

}


정수 Alert1()

{

if (OrdersTotal() == 0)

int send1=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,0,0);

리턴(0);

}


정수 Alert2()

{

if(주문 총계() == 1)

int send2=OrderSend("USDCHF",OP_BUY,Lots,Ask,3,0,0);

리턴(0);

}


정수 Alert3()

{

동안 (OrdersTotal()>0)

if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) //닫기

int cl1=OrderClose (OrderTicket(),OrderLots(),Bid,3);

int cl1=OrderClose (OrderTicket(),OrderLots(),Ask,3);

리턴(0);

}

 

Alexey Belyakov :   CУТЬ ПРОБЛЕММЫ: Не всегда открывает 2 сделки, а бывает открывает 3. Или открывает две сделки по одной валюте. Нужно чтобы: открывал всегда 2 сделки по разным валютам ( одна - по EURUSD; другая- по USDCHF)

서버는 유로를 열도록 명령받습니다. 서버에 도착할 때까지, 서버까지... 지금까지 주문은 0건입니다.다음 틱에서 조건이 다시 충족되고 유로를 다시 열라는 주문입니다. 서버가 첫 번째 주문을 열었습니다. 1개의 주문이 있으므로 두 번째(이미 세 번째입니다!) 주문을 열라는 명령이 전송됩니다.

모든 기능을 무효화하고 반환을 제거했습니다. 프로그램의 이 부분(SRC 버튼을 눌러 붙여넣었습니다)

   if ((ind2>ind1+impulse* Point && ind3<ind4-impulse* Point ) ||
     (ind2<ind1-impulse* Point && ind3>ind4+impulse* Point ))   // Условие открытия
     if ( OrdersTotal () == 0 ) Alert1();
     if ( OrdersTotal () == 1 ) Alert2();
}

void Alert1()
{
   if ( OrdersTotal () == 0 )  // Перед вызовом этой функции уже проверялось количество ордеров
  int send1= OrderSend ( "EURUSD" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
}

void Alert2()
{
   if ( OrdersTotal () == 1 )  // Перед вызовом этой функции уже проверялось количество ордеров
  int send2= OrderSend ( "USDCHF" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
}

대체 (대략, 그러나 원래 것보다 IMHO가 더 좋음)

   if ((ind2>ind1+impulse* Point && ind3<ind4-impulse* Point ) ||
     (ind2<ind1-impulse* Point && ind3>ind4+impulse* Point ))   // Условие открытия
     if ( OrdersTotal () == 0 )
  {
     int send1= OrderSend ( "EURUSD" , OP_BUY ,Lots, Ask , 3 , 0 , 0 ); 
     int send2= OrderSend ( "USDCHF" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
     Sleep ( 60 ); // Дождаться следующего бара , а то еще пооткрывает
  }
}

Alert3 함수의 추가 라인

   int cl1= OrderClose ( OrderTicket (), OrderLots (), Ask , 3 );
double 대신 CHF=(int)DoubleToStr(oper2*100000,0); 시도 int CHF=oper2/_Point;
 
STARIJ :

대체 (대략, 그러나 원래 것보다 IMHO가 더 좋음)

무례하지는 않지만 오류와 함께 작동합니다. 두 주문이 하나의 기호에 대한 질문을 따르기 때문입니다.
 
Alexey Kozitsyn : 무례하지는 않지만 오류와 함께 작동합니다. 두 주문이 하나의 기호에 대한 질문을 따르기 때문입니다.

물론, 당신은 절대적으로 옳습니다. 게다가 이 오류는 소스 코드에 포함되어 있었지만 작성자와 당신, 그리고 죄인인 나로부터의 기능을 사용하여 가려졌습니다. 기능이 제거된 후 오류가 분명해졌습니다. 나는 어드바이저가 위치한 차트의 심볼에 의해서만 포지션이 열릴 것이라고 믿습니다. 그래서?

 
STARIJ :

물론, 당신은 절대적으로 옳습니다. 게다가 이 오류는 소스 코드에 포함되어 있었지만 작성자와 당신, 그리고 죄인인 나로부터의 기능을 사용하여 가려졌습니다. 기능이 제거된 후 오류가 분명해졌습니다. 나는 어드바이저가 위치한 차트의 심볼에 의해서만 포지션이 열릴 것이라고 믿습니다. 그래서?

네. 물론 개업 조건이 충족되지 않는 한. 두 번째 캐릭터는 별도로 구하셔야 합니다.
 
안녕 모두. 질문은 순진 하며 OrdersTotal() 함수 에 관한 것입니다. 그것은 주문의 수를 반환하고 주문은 0에서 N까지 번호가 매겨진 것이 분명합니다. 그러나 막대가 기록에서 열린 새 막대에서 번호가 매겨진 경우, 즉 "신선한" 막대는 0으로 번호가 매겨지고 고대는 N입니다. 그리고 OrdersTotal() 함수에서 제가 이해하는 바와 같이 반대가 발생합니다. 고대 오픈 주문은 0으로, "신선한" 1은 N으로 번호가 지정됩니다. 내가 올바르게 이해했는가?
 
Youri Lazurenko :
안녕 모두. 질문은 순진 하며 OrdersTotal() 함수 에 관한 것입니다. 그것은 주문의 수를 반환하고 주문은 0에서 N까지 번호가 매겨진 것이 분명합니다. 그러나 막대가 기록에서 열린 새 막대에서 번호가 매겨진 경우, 즉 "신선한" 막대는 0으로 번호가 매겨지고 고대는 N입니다. 그리고 OrdersTotal() 함수에서 제가 이해하는 바와 같이 반대가 발생합니다. 고대 오픈 주문은 0으로, "신선한" 1은 N으로 번호가 지정됩니다. 내가 올바르게 이해했는가?

당연하지만 뉘앙스가 있습니다.

터미널에서 분류에 의존하던 시절이 있었습니다. 사용자 중 누구도 다시 정렬이 터미널의 정렬에 의존하게 될 때 바로 "갑자기" 반환할지 여부를 확신할 수 없습니다. 따라서 배열로 주문을 수집하고 개장/마감 시간별로 정렬하는 것이 더 안정적입니다. 그러면 정렬이 터미널에서 "갑작스럽게" 정렬되는 것이 아니라 시간에 따라 달라진다는 것을 확실히 알게 될 것입니다.

 
Artyom Trishkin :

당연하지만 뉘앙스가 있습니다.

터미널에서 분류에 의존하던 시절이 있었습니다. 사용자 중 누구도 다시 정렬이 터미널의 정렬에 의존하게 될 때 바로 "갑자기" 반환할지 여부를 확신할 수 없습니다. 따라서 배열로 주문을 수집하고 개장/마감 시간별로 정렬하는 것이 더 안정적입니다. 그러면 정렬이 터미널에서 "갑작스럽게" 정렬되는 것이 아니라 시간에 따라 달라진다는 것을 확실히 알게 될 것입니다.


안녕하세요. 답변 해주셔서 감사합니다. 처음에는 역주기에 대한 내 질문에 대한 이전 답변으로 돌아가고 싶습니다. 어제 퇴근하기 전에 답글을 작성했는데 오늘은 내(그리고 당신의) 게시물을 전혀 찾지 못했습니다. 내가 이해한 대로 잘못된 스레드에서 질문했습니다. 역주기는 i--?

"따라서 배열로 주문을 수집하고 시작/닫는 시간별 로 정렬하는 것이 더 안정적입니다." - 매우 흥미롭고 믿을 수 있고 더 정확해 보입니다. 항상 필요한 것을 해결하는 것은 아닙니다). 어렵지 않다면 일반적으로 어떻게 합니까(배열을 만들고 시간을 열어서)?

그리고 더. 지금까지 아이디어와 보는 것은 아직 그것을 구현하려고 시도하지 않았습니다. 수익성이 있는 주문과 수익성이 없는(잠금) 주문이 있습니다. 이익 주문은 후행 정지로 마감됩니다. 주문이 마감되었음을 기록하여 나중에 전체 이익을 무익한 것의 이익과 비교할 수 있고 플러스 잔액이 있으면 무익한 것의 청산도 할 수 있습니다. 내가 관심있는 것은 주문이 마감되었다는 것입니다.

 
STARIJ :

나는 어드바이저가 위치한 차트의 심볼에 의해서만 포지션이 열릴 것이라고 믿습니다. 그래서?

EA가 EURUSD에서 작동하지만 USDCHF에 BUY 주문을 삽입하려는 경우

그런 다음 OrderSend 에서 MarketInfo("USDCHF",MODE_ASK)를 사용해야 합니다. Ask 대신(EURUSD로)