B=iMA(NULL,0,기간_MA_2,0, MODE_SMA ,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0, MODE_SMA ,PRICE_CLOSE,2); // 씨
D=iMA(NULL,0,기간_MA_2,0, MODE_SMA ,PRICE_CLOSE,2); // 디
이동 평균을 계산하는 방법(더하기가 표시될 수 있음)을 변경하자마자 간단한 방법( MODE_SMA ) 대신 지수 함수( MODE_EMA ) 와 다른 하나( MODE_SMMA )를 입력합니다. 부드러운 방법, 모든 것이 즉시 잘못됩니다. 작동 원리가 재미있어지면(전략 테스터에서) 고문은 주어진 기간의 맨 처음에 주문을 열고 마지막에 닫습니다. 저것들. 매년 그는 기간이 시작될 때 하나의 단일 거래를 시작하고 마지막에 닫습니다. 결과적으로 상담원은 나에게 플러스를 보여주었지만 나는 그런 플러스가 필요하지 않습니다. 나 자신은 동전을 던지고 매수 또는 매도 주문을 열 수 있으며, 1년 후에 플러스 또는 마이너스가 될 것인지 확인할 수 있습니다. 그런데 MODE_SMA 대신 MODE_LWMA (선형 가중 이동 평균)를 넣으면 프로그램이 제대로 작동합니다.
무슨 일인지 말해주세요? 결국 원리는 동일하며 이동 평균을 계산하는 방법이 약간 다를 뿐입니다.
고문을 어떻게 주문할 수 있습니까?
왜 그런 겁니까?
EA는 각 틱을 처리하고 각 틱에서 주문을 확인하고 엽니다.... 마지막 열린 위치 의 시간을 기억하고 15분 동안 일시 중지하거나 바를 열거나 닫는 작업을 해야 합니다. 코드에서는 막대의 시간에 묶이는 것이 좋습니다.
고문을 어떻게 주문할 수 있습니까?
그런 것...
나쁜 예. 양초의 시가는 반복될 수 있기 때문에. 하지만 시간이 없습니다.
동의한다:)))
MKL4를 마스터하고 테스트를 위한 Expert Advisor를 작성 하려고 합니다. 그런 질문들이 있었습니다.
1) 특정 쌍의 미닛 캔들 누락에 대한 분석 이력을 확인하는 절차가 있습니까? 절차가 이미 작성되어 온라인에서 사용할 수 있습니까?
2) 공백이 있거나 기록이 충분하지 않은 경우, 필요한 날짜에서 이 및/또는 다른 쌍에 대한 어드바이저로부터 미닛 캔들을 완전히 다운로드하거나 공백을 채우려면 어떻게 해야 합니까?
아이디어는 EA가 작업하는 동안 이력의 정확성을 확인하고 필요한 경우 간격이나 적은 수의 막대를 수정하는 것입니다.프로그래밍 언어를 배우고 있는데 프로그램에서 이해할 수 없는 동작이 발생했습니다. 교재를 바탕으로 어드바이저를 작성했는데 조금 다른 작동 원리로 변경했습니다.
2 이동 평균을 기반으로 한 전문가 고문. 아이디어는 간단하고 이동 평균이 교차하고 주문이 닫히고 반대가 열립니다. 나는 고문을 썼고 잘 작동합니다. 물론 작은 마이너스이지만 아이디어에 따라. 전체 개그는 다음과 같습니다(굵게 강조 표시됨).
A=iMA(NULL,0,Period_MA_1,0 ,MODE_SMA, PRICE_CLOSE,1); // ㅏ
B=iMA(NULL,0,기간_MA_2,0, MODE_SMA ,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0, MODE_SMA ,PRICE_CLOSE,2); // 씨
D=iMA(NULL,0,기간_MA_2,0, MODE_SMA ,PRICE_CLOSE,2); // 디
이동 평균을 계산하는 방법(더하기가 표시될 수 있음)을 변경하자마자 간단한 방법( MODE_SMA ) 대신 지수 함수( MODE_EMA ) 와 다른 하나( MODE_SMMA )를 입력합니다. 부드러운 방법, 모든 것이 즉시 잘못됩니다. 작동 원리가 재미있어지면(전략 테스터에서) 고문은 주어진 기간의 맨 처음에 주문을 열고 마지막에 닫습니다. 저것들. 매년 그는 기간이 시작될 때 하나의 단일 거래를 시작하고 마지막에 닫습니다. 결과적으로 상담원은 나에게 플러스를 보여주었지만 나는 그런 플러스가 필요하지 않습니다. 나 자신은 동전을 던지고 매수 또는 매도 주문을 열 수 있으며, 1년 후에 플러스 또는 마이너스가 될 것인지 확인할 수 있습니다. 그런데 MODE_SMA 대신 MODE_LWMA ( 선형 가중 이동 평균)를 넣으면 프로그램이 제대로 작동합니다.
무슨 일인지 말해주세요? 결국 원리는 동일하며 이동 평균을 계산하는 방법이 약간 다를 뿐입니다.
전체 프로그램 코드는 다음과 같습니다.
//+----------------------------------------------- --------------------+
//| 2개의 Movings.mq4 기반 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+----------------------------------------------- --------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#속성 링크 "http://www.metaquotes.net"
//------------------------------------------------ --------------- 하나 --
// M15의 숫자 값
extern int Period_MA_1=6; // MA 기간 1
extern int Period_MA_2=15; // MA 기간 2
외부 이중 로트=0.1; // 하드 코딩된 숫자 제비
bool 작업=true; // 전문가 고문이 작동합니다.
문자열 기호; // 금융의 이름. 도구
//------------------------------------------------ --------------- 2 --
정수 시작()
{
정수
Total, // 창의 주문 수
Tip=-1, // 유형이 선택되었습니다. 주문(B=0,S=1)
티켓; // 주문 번호
더블
가치. 끝에서 첫 번째 마디에 대한 MA_1
B, // 값. 끝에서 첫 번째 마디에 대한 MA_2
Price, // 선택한 주문의 가격
C, // 값. 끝에서 두 번째 마디의 경우 MA_1
D, // 값. 끝에서 두 번째 마디의 경우 MA_2
많은; // 수량 선택된 순서대로 로트
부울
Ans =false, // 종료 후 서버 응답
Cls_B=false, // Buy 마감 기준
Cls_S=false, // Sell 마감 기준
Opn_B=false, // 매수 개시 기준
Opn_S=거짓; // Sell 열기 기준
//------------------------------------------------ --------------- 삼 --
// 전처리
if(Bars < Period_MA_2) // 막대가 충분하지 않음
{
Alert("창에 막대가 부족합니다. Expert Advisor가 작동하지 않습니다.");
반품; // start()에서 종료
}
if(Work==false) // 치명적인 오류
{
Alert("심각한 오류입니다. Expert Advisor가 작동하지 않습니다.");
반품; // start()에서 종료
}
//------------------------------------------------ --------------- 4 --
// 주문에 대한 회계
기호=기호(); // fin.instr의 이름.
총=0; // 주문 수
for(int i=1; i<=OrdersTotal(); i++) // 순서를 통해 루프
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // 다음이 있는 경우
{ // 주문 분석:
if (OrderSymbol()!=Symb) 계속; // 핀란드어가 아닙니다. 도구
if (OrderType()>1) // 보류 중입니다.
{
Alert("대기 중인 주문이 감지되었습니다. Expert Advisor가 작동하지 않습니다.");
반품; // start()에서 종료
}
총++; // 시장 카운터 큰 떼거리
if (Total>1) // 하나 이상의 주문
{
Alert("여러 개의 시장 주문입니다. Expert Advisor가 작동하지 않습니다.");
반품; // start()에서 종료
}
티켓=OrderTicket(); // 선택된 번호. 주문.
Tip=주문유형(); // 선택한 주문의 유형입니다.
가격 = OrderOpenPrice(); // 가격이 선택되었습니다. 주문.
Lot=OrderLots(); // 랏 수
}
}
//------------------------------------------------ --------------- 5 --
// 거래 기준
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // ㅏ
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // 씨
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // 디
if (A<C&&C>D&&B>=A) // MA1 라인은 위에서 아래로,
{ // MA1과 MA2 교차
Opn_B=참; // 위에서 아래로
CLs_S=참; //
}
if (B<D&&D>C&&A>=B) // MA2 라인은 위에서 아래로 이동합니다.
{ // MA2가 MA1을 교차
Opn_S=참; // 위에서 아래로
Cls_B=참; //
}
//------------------------------------------------ --------------- 6 --
// 마감 주문
while(true) // 주문 마감 주기.
{
if (Tip==0 && Cls_B==true) // 매수 주문이 열렸습니다..
{ //종료 기준이 있습니다.
Alert("구매를 종료하려고 합니다. ",티켓,". 응답을 기다리는 중입니다..");
새로 고침(); // 데이터 업데이트
Ans=OrderClose(티켓, 로트, 입찰, 2); // 닫기 구매
if (Ans==true) // 알았습니다 :)
{
Alert("구매 주문 마감됨",티켓);
부서지다; // 닫기 루프에서 종료
}
if (Fun_Error(GetLastError())==1) // 오류 처리
계속하다; // 재시도
반품; // start()에서 종료
}
if (Tip==1 && Cls_S==true) // 매도 주문이 열렸습니다..
{ // 닫는 기준이 있습니다.
Alert("판매 종료 시도 ",티켓,". 응답을 기다리는 중입니다..");
새로 고침(); // 데이터 업데이트
Ans=OrderClose(티켓,로트,매도,2); // 닫기 판매
if (Ans==true) // 알았습니다 :)
{
Alert("판매 주문 마감됨",티켓);
부서지다; // 닫기 루프에서 종료
}
if (Fun_Error(GetLastError())==1) // 오류 처리
계속하다; // 재시도
반품; // start()에서 종료
}
부서지다; // 종료하는 동안
}
//------------------------------------------------ --------------- 7 --
//------------------------------------------------ --------------- 여덟 --
// 오픈 오더
while(true) // 주문 마감 주기.
{
if (Total==0 && Opn_B==true) // 주문을 엽니다. 아니 +
{ // 열린 기준 구입
새로 고침(); // 데이터 업데이트
Alert("구매를 열려고 합니다. 응답을 기다리는 중입니다..");
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0,"2xMA Expert Advisor");//오픈 구매
if (티켓 > 0) // 성공 :)
{
Alert("구매 주문 오픈",티켓);
반품; // start()에서 종료
}
if (Fun_Error(GetLastError())==1) // 오류 처리
계속하다; // 재시도
반품; // start()에서 종료
}
if (Total==0 && Opn_S==true) // 주문을 엽니다. 아니 +
{ // 열린 기준 팔다
새로 고침(); // 데이터 업데이트
Alert("판매를 열려고 합니다. 응답을 기다리는 중입니다..");
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0,"2xMA Expert Advisor");//Open Sel
if (티켓 > 0) // 성공 :)
{
Alert("판매 주문 오픈",티켓);
반품; // start()에서 종료
}
if (Fun_Error(GetLastError())==1) // 오류 처리
계속하다; // 재시도
반품; // start()에서 종료
}
부서지다; // 종료하는 동안
}
//------------------------------------------------ --------------- 아홉 --
반품; // start()에서 종료
}
//------------------------------------------------ -------------- 십 --
int Fun_Error(int Error) // 오류 처리 함수
{
스위치(오류)
{ // 피할 수 있는 오류
case 4: Alert("거래 서버가 바쁘다. 다시 시도해보자..");
수면(3000); // 간단한 솔루션
반환(1); // 함수 종료
case 135:Alert("가격이 변경되었습니다. 다시 시도해보세요..");
새로 고침(); // 데이터 업데이트
반환(1); // 함수 종료
case 136:Alert("가격이 없습니다. 새 틱을 기다리는 중입니다..");
while(RefreshRates()==false) // 다음 틱까지
수면(1); // 루프에서 지연
반환(1); // 함수 종료
case 137:Alert("브로커가 사용 중입니다. 다시 시도합니다..");
수면(3000); // 간단한 솔루션
반환(1); // 함수 종료
case 146:Alert("거래 하위 시스템이 사용 중입니다. 다시 시도하십시오..");
수면(500); // 간단한 솔루션
반환(1); // 함수 종료
// 치명적인 오류
사례 2: Alert("일반 오류입니다.");
리턴(0); // 함수 종료
사례 5: Alert("이전 터미널 버전입니다.");
작업=거짓; // 더 이상 작동하지 않음
리턴(0); // 함수 종료
case 64: Alert("계정이 차단되었습니다.");
작업=거짓; // 더 이상 작동하지 않음
리턴(0); // 함수 종료
case 133:Alert("거래가 금지됩니다.");
리턴(0); // 함수 종료
case 134:Alert("작업을 완료하기 위한 자금이 충분하지 않습니다.");
리턴(0); // 함수 종료
기본값: Alert("오류가 발생했습니다. ",Error); // 다른 옵션
리턴(0); // 함수 종료
}
}
//------------------------------------------------ -------------- 열하나 --
프로그래밍 언어를 배우고 있는데 프로그램에서 이해할 수 없는 동작이 발생했습니다. 교재를 바탕으로 어드바이저를 작성했는데 조금 다른 작동 원리로 변경했습니다.
오더를 마감할 때 토탈을 줄이는 것도 좋겠지만 머리를 급하게 하지 말고 기호와 마법으로 열린 오더의 수를 반환하는 함수를 만드는 것이 좋습니다.
4개의 이동 평균 은 과잉이며 두 기간 및 다른 오프셋으로 의미가 있습니다. 화면에 표시하고 어떻게 동작하는지 확인하는 것이 좋습니다.