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

 
Maxim Kuznetsov :

if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {

  // время time[i] попало внутрь бара открытого в time_m1

}

좋음) 화살 1개 단, 이 조건에 따라 M15 이상에서 화살은 21시에 배치

 if (time[i]>= StringToTime ( "2019.04.22 20:55:00" ) && time[i]< StringToTime ( "2019.04.22 20:55:00" )+ Period ()* PeriodSeconds ( PERIOD_M1 ))

그리고 마침표 ()* 없이 +PeriodSeconds( PERIOD_M1 ) 이면 전혀 설정되지 않습니다)

 
yiduwi :

좋음) 화살 1개 단, 이 조건에 따라 M15 이상에서 화살은 21시에 배치

그리고 마침표 ()* 없이 +PeriodSeconds( PERIOD_M1 ) 이면 전혀 설정되지 않습니다)

이미 문서를 읽으십시오 :-) Period()는 현재 기간의 ID만 반환합니다. 왜 이를 곱하고 있습니까?

PERIOD_M1(예시로 제공됨) 대신 PeriodSeconds( Period() )에 전달되어야 합니다. 그러면 현재 기간의 1바에 몇 초가 있는지 알 수 있습니다.

 
kopeyka2 :

여기에 "버뮤다 평행 육면체"의 신비가 있습니다.

나를 위해 작동합니다 :) 터미널을 열거나 닫으려고 시도했습니다.

추신: Artyom, 당신은 다섯 번째 주제에 대한 질문을 네 번째 주제로 옮겼습니다... 우연히 찾았습니다.

 
kopeyka2 :


EMA 라인 20 23.04.2019 00:00

온라인 연결 없이 MT5를 켜면 "array out ...." 메시지가 즉시 나타납니다.

오류는 다양하지만 항상 존재합니다. 그들은 온라인에서 번식할 수 있지만 MT가 켜져 있을 때 더 자주 나타납니다.


여기에 "버뮤다 평행 육면체"의 신비가 있습니다.

오류 메시지 에는 오류가 발생한 줄 번호가 포함됩니다. 거기서부터 파기 시작
 
Igor Zakharov :

나를 위해 작동합니다 :) 터미널을 열거나 닫으려고 시도했습니다.

추신: Artyom, 당신은 다섯 번째 주제에 대한 질문을 네 번째 주제로 옮겼습니다... 우연히 찾았습니다.

이 주제는 일반적입니다. 여기에서는 MQL4뿐만 아니라 MQL5로의 전환도 지원합니다. 그래서 - 주제에.

 
텍스트 .csv 파일에서 거래 가격을 가져오는 Expert Advisor 코드를 개념적으로 올바르게 작성하는 방법을 알려주십시오. 이 질문이 발생한 이유: 각 틱에서 EA는 현재 가격을 .csv 파일의 가격과 비교합니다. 이 가격은 내가 올바르게 이해한다면 fileopen 함수 의 루프에서 완전히 읽혀집니다. 그러나 파일에는 작년에 대한 5000개 이상의 행이 포함되어 있으며 각 행에는 상품명, 가격, 거래 유형(매수/매도), 입력 날짜, 주문 취소 날짜가 포함되어 있습니다. 각 눈금에 대해 테스트할 때 고문은 주문할 시간인지 여부를 이해하기 위해 파일의 모든 줄을 순환합니다. 아니면 테스트용으로 EA가 초기화 시 취소날짜가 있는 모든 주문을 일괄적으로 설정하고, 실제 거래의 경우 현재 주문을 매 틱 만료시간까지 가격으로 확인하나요? 어쩌면 나는 그것이 자원의 관점에서 얼마나 정확한지 또는 다른 옵션이 있는지 상상하지 못합니다. ), 이해가 되지 않습니다. 조언 부탁드립니다.
 

안녕하세요!


MQL4 프로그래밍에 대한 비디오 자습서를 다운로드하십시오.

글쎄, 나는 수업에 따라 고문을 만들었습니다.

그러나 거래하는 동안 작동하지 않는 것은 무엇입니까?

컴파일하는 동안 오류가 없습니다.

여행의 시작에 있기 때문에 여전히 실수를 찾기가 어렵습니다.

누구든지 가능하면 도와주세요.

고맙습니다!

코드:

/+----입력 매개변수----------------+

외부 int BarCount=10;

extern int HourStart=14;

외부 이중 로트=0.1;

extern int StopLoss=120;

외부 정수 TakeProfit=300;

extern int Magic=1456;

//+------------전역 변수----------------+

이중 최소 가격 = 999999,mp,

최대 가격=-99999,SL,TP;

인트 티켓;

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

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

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

int OnInit()

{

반환(INIT_SUCCESSED);

}

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

//| 전문적인 초기화 해제 기능 |

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

무효 OnDeinit(const int 이유)

{


}

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

//| 전문가 틱 기능 |

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

무효 OnTick()

{

getminprice();

GetMaxPrice();


if(TimeHour(TimeCurrent())==HourStart)

{

if(BuyLimitCount()&& BuyCount() ==0)

{

SL=NormalizeDouble(최소 가격-스톱로스*포인트,5);

TP=NormalizeDouble(최소 가격+이익 실현*포인트,5);

ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,minprice,5,SL,TP,"",Magic,0,Blue);

if(티켓<0)

Print("구매한도 개설시 실패");

}

if(SellLimitCount()&& SellCount()==0)

{

SL=NormalizeDouble(maxprice+StopLoss*Point,5);

TP=NormalizeDouble(maxprice-TakeProfit*Point,5);

ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,maxprice,5,SL,TP,"",Magic,0,Red);

if(티켓<0)

Print("판매한도 개시시 실패");

}

}



Comment("MinPrice: "+DoubleToStr(minprice,5)+"\n"+"MaxPrice: "+DoubleToStr(maxprice,5));


}

//+-바카운트 바의 수에 대한 최소 가격을 결정하기 위한 함수

무효 GetMinPrice()

{

for(int i=0; i<BarCount; i++)

{

mp=iLow(심볼(),PERIOD_CURRENT,i);

if(mp<최소 가격)

최저 가격=mp;

}

반품;

}

//+-바카운트 바의 최대 가격을 결정하는 함수

무효 GetMaxPrice()

{

for(int i=0; i<BarCount; i++)

{

mp=iHigh(심볼(),PERIOD_CURRENT,i);

if(mp>maxprice)

최고가=mp;

}

반품;

}

//+-오픈 리미트 구매 주문의 수를 결정하기 위한 함수

int BuyLimitCount()

{

정수 수 = 0;

for(int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUYLIMIT)

{

카운트++;

}

}

리턴(카운트);

}

//+-오픈 제한 판매 주문의 수를 결정하기 위한 함수

int SellLimitCount()

{

정수 수 = 0;

for(int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELLLIMIT)

{

카운트++;

}

}

반환(카운트);

}

//+-공개 시장 구매 주문 의 수를 결정하기 위한 함수

int BuyCount()

{

정수 수 = 0;

for(int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY)

{

카운트++;

}

}

리턴(카운트);

}

//+-공개 시장 판매 주문 수를 결정하는 함수

int SellCount()

{

정수 수 = 0;

for(int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL)

{

카운트++;

}

}

반환(카운트);

}

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


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

 

Seric29

감사합니다. 귀하의 정보를 제 수하물에 추가하겠습니다.

 
WinProject :
텍스트 .csv 파일에서 거래 가격을 가져오는 Expert Advisor 코드를 개념적으로 올바르게 작성하는 방법을 알려주십시오. 이 질문이 발생한 이유: 각 틱에서 EA는 현재 가격을 .csv 파일의 가격과 비교합니다. 이 가격은 내가 올바르게 이해한다면 fileopen 함수 의 루프에서 완전히 읽혀집니다. 그러나 파일에는 작년에 대한 5000개 이상의 행이 포함되어 있으며 각 행에는 상품명, 가격, 거래 유형(매수/매도), 입력 날짜, 주문 취소 날짜가 포함되어 있습니다. 각 눈금에 대해 테스트할 때 고문은 주문할 시간인지 여부를 이해하기 위해 파일의 모든 줄을 순환합니다. 아니면 테스트용으로 EA가 초기화 시 취소날짜가 있는 모든 주문을 일괄적으로 설정하고, 실제 거래의 경우 현재 주문을 매 틱 만료시간까지 가격으로 확인하나요? 어쩌면 나는 그것이 자원의 관점에서 얼마나 정확한지 또는 다른 옵션이 있는지 상상하지 못합니다. ), 이해가 되지 않습니다. 조언 부탁드립니다.

일반적으로 파일에 읽기(쓰기)를 시도하는 최소 횟수

작업을 위해 로드할 때 데이터를 배열로 읽은 다음(구조에 더 편리할 수 있음) 배열 이메일과 현재 가격 및 시간 값을 비교하는 것이 더 최적입니다.

추신: 코드베이스 검색 "file" 또는 "csv"는 이미 만들어진 Expert Advisors였습니다. 파일에서 읽고 이 데이터에 따라 거래합니다.

 
Igor Makanu :

일반적으로 파일에 읽기(쓰기)를 시도하는 최소 횟수

작업을 위해 로드할 때 데이터를 배열로 읽은 다음(구조에 더 편리할 수 있음) 배열 이메일과 현재 가격 및 시간 값을 비교하는 것이 더 최적입니다.

추신: 코드베이스 검색 "file" 또는 "csv"는 이미 만들어진 Expert Advisors였습니다. 파일에서 읽고 이 데이터에 따라 거래합니다.

정말 감사합니다, 제가 원하는 답변을 얻었습니다.

사유: