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

 
Alexey Viktorov :

그리고 다른 것은 있을 수 없습니다. 1970년보다 작은 컴퓨터는 없습니다. 브로커가 나열한 연도부터 시작하십시오.

이해) 감사합니다.
 
Aleksey Vyazmikin :

MT5의 코드

결과:


ZY: 코드가 변경되었습니다. ME가 변경되지 않았습니다.

의도한 내용을 즉시 이해하지 못했습니다. 나는 mql5에서 그것을하지 않았다, 나는 그것을 알아 내려야 할 것이다. 그러나 mql4에서는 다음과 같이 할 수 있습니다.

2개의 추가 버퍼를 가져옵니다.

오프셋을 N개의 막대로 설정하고 이 N개의 막대를 메인 버퍼의 마지막 값으로 채웁니다.

물론 이러한 추가 버퍼의 N+1 인덱스는 빈 값으로 채워야 합니다.

 
Alexey Viktorov :

나는 의도한 바를 즉시 이해하지 못했다. 나는 mql5에서 그것을하지 않았다, 나는 그것을 알아 내려야 할 것이다. 그러나 mql4에서는 다음과 같이 할 수 있습니다.

2개의 추가 버퍼를 가져옵니다.

오프셋을 N개의 막대로 설정하고 이 N개의 막대를 메인 버퍼의 마지막 값으로 채웁니다.

물론 이러한 추가 버퍼의 N+1 인덱스는 빈 값으로 채워야 합니다.


아이디어 주셔서 감사합니다. 처음에 MT5에서 이 작업을 수행한 다음 최적화했습니다.

일반적으로 새벽 4시에 잠자리에 들었지만(물론 공개 코드는 완전하지 않음) 두 개의 버퍼로 원하는 작업을 수행했습니다.

문제는 MT5에서는 채우기가 왼쪽에서 오른쪽으로 진행되지만 MT4에서는 그 반대의 경우가 발생한다는 것입니다. ArraySetAsSeries 함수는 도움이 되지 않았습니다. 실제로 전체 논리를 다시 작성했습니다.

 

좋은 오후, 아르템!

TrExp_Nik 버전을 변경하는 데 도움을 요청하고 싶습니다. MQL 4 책에서 가져온 Expert Advisor의 표준 코드에서 4. 손익분기점으로 전환하는 기능을 추가하고 싶지만 제한된 프로그래밍 능력으로 인해 불가능합니다. e-MovingInWL을 기본으로 사용하기로 결정했습니다. 이 코드의 코드를 Expert Advisor에 통합하려고 했지만 변수를 올바르게 결합하거나 두 번째 손익분기점 Expert Advisor의 코드를 잘못 이해했습니다. 아마도 이것은 최선의 선택이 아닐 것입니다. 그런 다음 어떻게 하면 더 잘하거나 더 쉽게 할 수 있는지 조언을 구하고 싶습니다.

파일:
 
niktach :

좋은 오후, 아르템!

TrExp_Nik 버전을 변경하는 데 도움을 요청하고 싶습니다. MQL 4 책에서 가져온 Expert Advisor의 표준 코드에서 4. 손익분기점으로 전환하는 기능을 추가하고 싶지만 제한된 프로그래밍 능력으로 인해 불가능합니다. e-MovingInWL을 기본으로 사용하기로 결정했습니다. 이 코드의 코드를 Expert Advisor에 통합하려고 했지만 변수를 올바르게 결합하거나 두 번째 손익분기점 Expert Advisor의 코드를 잘못 이해했습니다. 아마도 이것은 최선의 선택이 아닐 것입니다. 그런 다음 어떻게 하면 더 잘하거나 더 쉽게 할 수 있는지 조언을 구하고 싶습니다.

안녕하세요. 정확히 무엇을 하려고 했습니까? 첨부된 코드 2개만 보입니다. 당신을 위해 모든 것을 해 줄 누군가가 필요하다면 프리랜서 가 바로 그것입니다.

그리고 자신이 노력하고 있다면 정확히 무엇을 하고 있는지, 그리고 이해하지 못하는 부분을 보여주십시오.

 

여보세요,

차트에 배치된 "삼각형" 그래픽 개체의 속성을 프로그래밍 방식으로 어떻게든 얻을 수 있습니까? 이것은 대화식으로 속성 양식을 열 때 "매개변수" 탭에 표시되는 피크의 시간 및 가격 좌표를 나타냅니다. ObjectGetInteger 및 ObjectGetDouble 함수를 사용하려고 했지만 이들의 도움으로 한 정점에 대한 데이터만 가져올 수 있습니다.

고맙습니다.

 
oddball :

여보세요,

차트에 배치된 "삼각형" 그래픽 개체의 속성을 프로그래밍 방식으로 어떻게든 얻을 수 있습니까? 이것은 대화식으로 속성 양식을 열 때 "매개변수" 탭에 표시되는 피크의 시간 및 가격 좌표를 나타냅니다. ObjectGetInteger 및 ObjectGetDouble 함수를 사용하려고 했지만 이들의 도움으로 한 정점에 대한 데이터만 가져올 수 있습니다.

고맙습니다.

할 수 있다. 그리고 생각의 방향이 맞습니다. 매개변수를 어떻게 사용하려고 했는지 보여주세요.

 
Artyom Trishkin :

티켓으로 주문을 선택할 때 을 지정할 필요가 없습니다. MODE_TRADES는 여기에서 필요하지 않습니다. 이 매개변수는 티켓으로 선택할 때 무시되며 주문은 마감 목록 또는 목록에서 두 목록 중 하나에서 선택됩니다. 시장 포지션의 - 포지션이 마감 되었는지 여부에 따라 달라집니다.

티켓으로 주문을 성공적으로 선택한 후 두 목록 중 어느 목록에서 주문이 선택되었는지 이해하려면 포지션 마감 시간을 확인해야 합니다. 0보다 크면 주문이 이미 마감되었으며 다음에서 선택되었습니다. 과거 주문 목록, 그렇지 않으면 주문이 여전히 시장에 있습니다.

그러나 오류가 무엇인지 이해하려면 코드를 첨부해야 합니다. 이 줄에는 원칙적으로 오류가 없기 때문에 더 많은 정보를 제공해야 합니다(함수의 반환 결과를 확인하지 않는 경우를 제외하고 무시된 수정자를 사용 이 경우 닫는 괄호 뒤에 ";"이 없음).


답변 주셔서 대단히 감사합니다.

그것이 전체 기능입니다. 요점은 주문을 연 다음 수정을 통해 일정한 손절매를 추가하고 이익 가치를 취한다는 것입니다.

따라서 주문은 열렸지만 손절매와 현재 이익은 내리지 않았습니다(빨간색으로 계산 함수를 강조 표시했습니다. 여기에서 OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) 오류가 발생합니다((( )

// 주문 개시 함수, 변수: 기호, 주문 유형, 로트, 공개 가격, TP 및 SL 계산 방법 (0 - 가격 설정, 1 - 공개 가격에서 계산할 포인트 설정), 손절매, 이익실현 )

//Symbol/Pair, open order type - pending, Open price, Switch = 1, SL B TP - 손절매와 이익실현 값은 일정하다!!!

bool SendOrder(문자열 기호, 정수 유형, 이중 OP, 정수 모드) {
색상 CL;
더블 Pp = MarketInfo(Symb, MODE_POINT);
if (유형==0) CL=파란색;
if (유형==1) CL=빨간색;
if (유형==2 || 유형==4) CL=DarkTurquoise;
if (유형==3 || 유형==5) CL=주황색;
// 볼륨 체크
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; 그렇지 않으면 DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("거래를 열 수 있는 자금이 충분하지 않습니다.",Type," volume: ",DoubleToStr(Lot,DG)),0);
반품;
}
// 대기 중인 주문 확인
/*
이중 Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (유형>1) {
if (유형==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (유형==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (유형==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (유형==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
새로 고침();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //최소 허용 손절매/포인트 단위 이익 수준. 최소 거리
이중 Tek_Ask = MarketInfo(Symb,MODE_ASK); //마지막으로 받은 판매 가격. 현재 기호의 경우 미리 정의된 변수 Ask에 저장됩니다.
이중 Tek_Bid = MarketInfo(Symb,MODE_BID); //마지막으로 받은 제안 가격. 현재 상품의 경우 사전 정의된 변수 Bid에 저장됩니다.
이중 Tek_Point = MarketInfo(Symb,MODE_POINT); //견적 통화의 포인트 크기. 현재 도구의 경우 사전 정의된 변수 Point에 저장됩니다.
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//상품 가격의 소수점 이하 자릿수. 현재 기기의 경우 사전 정의된 변수 Digits에 저장됩니다.

이중 Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (유형>1) {
if (유형==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (유형==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (유형==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
if (유형==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// 검사 중지
if (SL!=0 || TP!=0) {
if (모드==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (유형==0 || 유형==2 || 유형==4) SL=OP-Slv; 그렇지 않으면 SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (유형==0 || 유형==2 || 유형==4) TP=OP+Slv; 그렇지 않으면 TP=OP-Slv;
}
}또 다른{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// 열려 있는
for(int k=0;k<=TryToTrade;k++) {
if (유형==0) OP=MarketInfo(Symb,MODE_ASK);
if (유형==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("주문 개설 시도, 유형: ",Type," 거래량: ",Lot," 가격: ",OP),0);
if (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("주문을 열 수 없습니다",k),0); 수면(3000); 계속하다; }
if (티켓 >= 0) { PnC(StringConcatenate("주문 오픈",티켓), 0); 부서지다; }
LastError=Fun_Error(GetLastError());
if (마지막 오류==0) {
새로 고침(); 절전(대기시간);
if (k==TryToTrade) return(거짓); }
if (LastError==1) return(거짓);
if (LastError==2) { 작업=거짓; 반환(거짓); }
}
// 정지 설정
OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) 반환;
if (모드==1) {
if (SL!=0) {
if (유형==0 || 유형==2 || 유형==4) SL=OrderOpenPrice()-SL*Pp;
if (유형==1 || 유형==3 || 유형==5) SL=OrderOpenPrice()+SL*Pp;
}
만약 (TP!=0) {
if (유형==0 || 유형==2 || 유형==4) TP=OrderOpenPrice()+TP*Pp;
if (유형==1 || 유형==3 || 유형==5) TP=OrderOpenPrice()-TP*Pp;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("주문에 대한 경유지 설정 시도: ",Ticket," s/l: ",SL," t/p: ",TP),0);
if (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS),0 ;
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS_NONE),0,CLR
}else{ PnC(StringConcatenate("주문을 수정할 수 없습니다. ",k),0); 수면(3000); 계속하다; }
if (TickeT == true) { PnC(StringConcatenate("수정된 주문 ",티켓), 0); 부서지다; }
LastError=Fun_Error(GetLastError());
if (마지막 오류==0) {
새로 고침(); 절전(대기시간);
if (k==TryToTrade) return(거짓); }
if (LastError==1) return(거짓);
if (LastError==2) { 작업=거짓; 반환(거짓); }
}
반환(참);

}

 

주문을 수정할 때 오류 131 " 잘못된 볼륨 "이 표시되는 이유를 설명할 수 있습니까?

입금은 정상적으로 오픈되고, 로트는 정상화되며, 출력 시 최소 로트는 0.01로 내 볼륨(데모 계정)보다 작지 않습니다.

포럼에서 모든 것을 읽었지만 문제가 무엇인지 찾지 못했습니다!!!

도무지 설명할 수 없는 숨은 고민들이 찾아와 놀라움을 금치 못한다.
 
forexman77 :

주문을 수정할 때 오류 131 " 잘못된 볼륨 "이 표시되는 이유를 설명할 수 있습니까?

입금은 정상적으로 오픈되고, 로트는 정상화되며, 출력 시 최소 로트는 0.01로 내 볼륨(데모 계정)보다 작지 않습니다.

포럼에서 모든 것을 읽었지만 문제가 무엇인지 찾지 못했습니다!!!

도무지 설명할 수 없는 숨은 고민들이 찾아와 놀라움을 금치 못한다.

다른 DC에서 시도했는데 모든 것이 정상인 것 같습니다. 질문은 왜 전화를 걸 때입니다.

 double MinLot = MarketInfo ( Symbol (), MODE_MINLOT );
double MaxLot = MarketInfo ( Symbol (), MODE_MAXLOT );
Alert ( "MinLot=" ,MinLot, "MaxLot=" ,MaxLot);  

0.01을 인쇄하지만 봇에서는 131을 인쇄합니까?