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

 
luxinterior:
OrderReliable 포함 파일을 사용하십시오. 럭스

OrderSendReliable 기능 에 대해 이 부분이 약간 누락된 것 같습니다. 나중 버전이 있습니까?

 

계산에 시간을 사용하는 방법

저는 MQL4가 처음이고 몇 가지 기본 기능 을 사용하는 간단한 EA를 만들 수 있는지 알아보려고 했습니다. 나는 C++를 잘 알고 있지만 MQL4에서는 끔찍할 것입니다. 왜냐하면 이 코드에 뭔가 문제가 있고 시간 함수 또는 아마도 구매/판매 함수와 관련이 있다고 생각하기 때문입니다. 코드는 다음과 같습니다. 기능만 테스트하면 돈을 벌 수 있습니다 감사합니다!

정수 시작()

{

//----

이중 currenttimeN, 현재 값;

더블 timeM = TimeMinute(TimeCurrent());

더블 timeH = TimeHour(TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440); // 하루 중 시간을 퍼센트 또는 1(1 = 완전한 하루)로 제공하므로 항상 1보다 작습니다.

현재값 = 묻다;

if (현재값 > 현재시간N){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point,"내 주문 #2",16384,0,Green);

}

/* 구매 명령 */

else if (현재값 < 현재시간N){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"내 주문 번호 2",16384,0,Green);

}

//----

리턴(0);

}

 

...........................

 

잘못된 문자열:

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

하루 중 일부와 가격을 어떻게 비교할 수 있습니까?

 

동시에 사고팔다

누군가 프로그래밍하는 것을 도와줄 수 있습니까? 그래서 나는 동시에 사고 팔 수 있습니다...일부 스크립트나 기타 등등...

감사합니다...

예시:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, 랏, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, 녹색);

ticket=OrderSend(Symbol(), OP_SELL, 랏, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point,"-", 0, 0, Red);

}

문제는 구매만 가능하다는 것입니다. 하지만 두 주문을 모두 실행하기 위해 필요했습니다... 감사합니다.

 
kk81:
누군가 프로그래밍하는 것을 도와줄 수 있습니까? 그래서 나는 동시에 사고 팔 수 있습니다...일부 스크립트나 기타 등등...

감사합니다...

예시:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, 랏, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, 녹색);

ticket=OrderSend(Symbol(), OP_SELL, 랏, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red);

}

문제는 구매만 가능하다는 것입니다. 하지만 두 주문을 모두 실행하기 위해 필요했습니다... 감사합니다.

https://www.mql5.com/en/forum/177583/page37

 

OrderClose 반품 가격을 얻는 방법은 무엇입니까?

주문 마감 가격이 얼마인지 알고 싶습니다.

파일:
closeorder.jpg  62 kb
 

외환 자유 바

안녕

모든 친구에게 감사합니다. 특정 Roger09

전문가(자동 거래) ForexFreedomBars를 원합니다.

정사각형 5m, 15m, 30m, 1H가 빨간색일 때 10-20 TP로 주문을 보내십시오.

정사각형 5m, 15m, 30m, 1H가 파란색일 때 10-20 TP로 주문을 보냅니다.

(TP, SL, lot, maxtrade) 능력은 변경되어야 합니다

도와주세요 .

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

//| #Forex 프리덤 바

//|

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

#property copyright "Programmed by Eli hayun"

#속성 표시기_분리_창

#속성 표시기_최소 -0.5

//#속성 표시기_최대 5

#속성 표시기_버퍼 8

#property indicator_color1 빨간색

#property indicator_color2 다저블루

#property indicator_color3 빨간색

#property indicator_color4 다저블루

#property indicator_color5 빨간색

#property indicator_color6 다저블루

#property indicator_color7 빨간색

#property indicator_color8 다저블루

//---- 버퍼

이중 buf4_up[];

이중 buf4_down[];

이중 buf3_up[];

이중 buf3_down[];

이중 buf2_up[];

이중 buf2_down[];

이중 buf1_up[];

이중 buf1_down[];

외부 이중 갭 = 1; // 막대 라인 사이의 간격

extern int Period_1 = PERIOD_M5;//M15

extern int Period_2 = PERIOD_M15;//M30

extern int Period_3 = PERIOD_M30;//H1

extern int Period_4 = PERIOD_H1;//H4

외부 int cci_1 = 2;//50

외부 int cci_2 = 2;//14

외부 정수 cci_3 = 2;

외부 int cci_4 = 2;

extern int StopLoss=100;

외부 정수 TakeProfit=100;

외부 이중 로트=0.1;

extern bool 자동 표시 = 거짓;

문자열 짧은 이름 = "";

부울 첫 번째 시간 = true;

정수 고유 번호 = 228;

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

//| 커스텀 인디케이터 초기화 기능 |

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

정수 초기화()

{

자동디스플레이();

shortname = "# 외환 자유("+Period_1+","+Period_2+","+Period_3+","+Period_4+")";

첫 번째 시간 = 참;

IndicatorShortName(짧은 이름);

//---- 표시기

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,110);

SetIndexBuffer(0,buf4_up);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,110);

SetIndexBuffer(1,buf4_down);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,110);

SetIndexBuffer(5,buf2_down);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,110);

SetIndexBuffer(6,buf1_up);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,110);

SetIndexBuffer(7,buf1_down);

SetIndexEmptyValue(7,0.0);

//----

리턴(0);

}

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

//| 커스텀 인디케이터 초기화 해제 기능 |

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

정수 초기화()

{

//----

자동디스플레이();

shortname = "# 외환 자유("+Period_1+","+Period_2+","+Period_3+","+Period_4+")";

첫 번째 시간 = 참;

//----

리턴(0);

}

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

//| 사용자 지정 표시기 반복 기능 |

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

정수 시작()

{

int counted_bars=IndicatorCounted();

정수 i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=막대-counted_bars;

날짜 시간 TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

if (처음 || NewBar())

{

첫 번째 시간 = 거짓;

정수 승리 = 고유 번호; // 창 찾기(짧은 이름);

이중 dif = 시간[0] - 시간[1];

(int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii),"FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii));

또 다른

ii=-1;

}

이중 시프트 = 0.2;

(ii=0; ii<4; ii++)

{

문자열 txt = "??";

이중 gp;

스위치 (ii)

{

사례 0: txt = tf2txt(기간_1); gp = 1 + 시프트; 부서지다;

사례 1: txt = tf2txt(Period_2); gp = 1 + 갭 + 시프트; 부서지다;

사례 2: txt = tf2txt(Period_3); gp = 1 + 갭*2 + 시프트; 부서지다;

사례 3: txt = tf2txt(Period_4); gp = 1 + 갭*3 + 시프트; 부서지다;

}

문자열 이름 = "FF_"+win+"_"+ii+"_"+txt;

ObjectCreate(이름, OBJ_TEXT, WindowFind(짧은 이름), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(이름, txt,8,"Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)

{

if (시간<TimeArray_5M[y5m]) y5m++;

if (시간<TimeArray_1H[y1h]) y1h++;

if (시간<시간배열_30M[y30m]) y30m++;

if (시간<TimeArray_15M[y15m]) y15m++;

정수 cci_n = cci_1;

(int tf = 0, tf < 4, tf++)

{

정수 prd;

스위치(tf)

{

사례 0: prd = Period_1; cci_n = cci_1; yy = y5m; 부서지다;

사례 1: prd = Period_2; cci_n = cci_2; yy = y15m; 부서지다;

사례 2: prd = Period_3; cci_n = cci_3; yy = y30m; 부서지다;

사례 3: prd = Period_4; cci_n = cci_4; yy = y1h; 부서지다;

}

이중 cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy);

이중 dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

이중 dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);

if (cci < 0) dUp = 1; 그렇지 않으면 dDn = 1;

스위치(tf)

{

경우 0: (dUp == EMPTY_VALUE) buf1_down = 1; 그렇지 않으면 buf1_up = 1; 부서지다;

경우 1: if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; 그렇지 않으면 buf2_up = 1 + 간격 * 1; 부서지다;

사례 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; 그렇지 않으면 buf3_up = 1 + 간격 * 2; 부서지다;

사례 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; 그렇지 않으면 buf4_up = 1 + 간격 * 3; 부서지다;

}

if (NewBar())

{

문자열 sDir = "";

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "위로";

if (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "아래로";

if (sDir != "")

{

PlaySound("alert1.wav");

Print("외환고속도로 - 방향 ",sDir);

}

}

}

}

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit); 또 다른

리턴(0);

}

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

문자열 tf2txt(int tf)

{

if (tf == PERIOD_M1) return("M1");

if (tf == PERIOD_M5) return("M5");

if (tf == PERIOD_M15) return("M15");

if (tf == PERIOD_M30) return("M30");

if (tf == PERIOD_H1) return("H1");

if (tf == PERIOD_H4) return("H4");

if (tf == PERIOD_D1) return("D1");

if (tf == PERIOD_W1) return("W1");

if (tf == PERIOD_MN1) return("MN1");

반품("??");

}

무효 SetValues(int p1, int p2, int p3, int p4)

{

기간_1 = p1; 기간_2 = p2; 기간_3 = p3; 기간_4 = p4;

}

무효 SetAutoDisplay()

{

if(자동 표시)

{

스위치(마침표())

{

경우 PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30); 부서지다;

경우 PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); 부서지다;

경우 PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1); 부서지다;

경우 PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1); 부서지다;

경우 PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4); 부서지다;

경우 PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); 부서지다;

경우 PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); 부서지다;

경우 PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1); 부서지다;

경우 PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1); 부서지다;

}

}

}

bool NewBar()

{

정적 날짜 시간 dt = 0;

if (시간[0] != dt)

{

dt = 시간[0];

반환(참);

}

반환(거짓);

}

 

필터 기능으로 Indicator를 EA로 마이그레이션하는 문제

내 EA에서 표시기의 일부를 기능으로 사용하려고 할 때 이제 세 가지 유형의 기능이 있음을 깨달았습니다. 첫 번째 유형은 프로세스를 수행하고 0을 반환하는 Void입니다. 두 번째 유형은 계산을 수행하고 하나의 결과를 반환합니다. 세 번째 유형은 처리할 특정 값 세트가 제공될 것으로 예상한 다음 하나의 결과를 리턴합니다.

내 계산에서 최소한 두 가지 다른 방법을 사용해야 하는 세 가지 결과가 생성되면 어떻게 해야 합니까? 이러한 계산은 다음과 같은 이유로 Start() 함수에 위치해야 할 수 있습니다. 정보는 외부 변수(수동으로 조정할 수 있음) 및 전역 변수(재컴파일하지 않는 한 정적으로 유지됨)에서 EA의 다양한 기능으로 흐릅니다. Start() 함수는 EA의 두뇌이며 정보를 얻기 위해 다른 함수에 접근합니다. 함수가 () 괄호 안에 해당 변수를 선언한 경우 해당 함수의 인수로 함수에 변수 집합을 전달할 수 있습니다. 그런 다음 결과를 다시 수신하고 프로세스를 완료하기 위해 다른 함수에 더 많은 변수를 전달할 수 있습니다.

변수를 다른 함수에 대한 인수로 전달하기 위해 일단 EA 코딩으로 어느 정도 성공을 거두기를 바랐습니다. 불행히도 0 나누기 오류가 발생했습니다. 값이 필요하지 않도록 한 함수에서 다른 함수로 값을 인수로 전달하려고 했기 때문일 수 있습니다. 실제로 누락되었으므로 0 나누기 오류가 발생했습니다. 다음 개정판에서는 중간 단계를 제거하고 사용된 함수에 직접 값을 전달했습니다.

(나는 MQL4 코딩을 배운 첫 두 달 동안 이 시점을 기록함으로써 나 자신에게 어떤 호의도 베풀지 않았다. 그러나 "MQL4 0분할 오류"를 인터넷 검색하는 사람이라면 누구나 내가 어떻게 해결했는지 알게 되어 기쁠 것이다. .)

다음 EA 개정판에서는 0분할 오류가 수정되었지만 내 전략 테스터의 저널 주석은 이제 스택 오버런을 표시했습니다. "MQL4 스택 오버런"을 검색하는 사람들을 위해 내가 찾은 원인을 게시하겠습니다. 주문을 열거나 수정할 때 가격을 변경할 때 "포인트" 상수를 사용하여 로트를 십진법 등가로 변환하는 데 실패했습니다.

내가 여기에 게시하고 싶은 마지막 팁(초기 2개월의 코딩 경험과 12개 이상의 EA 재작성 후)은 찾기 어려운 "동일한 왼쪽 괄호" 괄호를 해결할 수 있었던 방법입니다. MetaEditor는 대괄호 텍스트를 색상으로 강조 표시하지 않습니다. Visual LISP Editor가 있는 AutoDesk 제품이 있는 경우 해당 편집기에서 MQ4 파일을 열고 거의 모든 브래킷 쌍을 색상으로 볼 수 있습니다. 이렇게 하면 누락된 브래킷에 대한 읽기를 훨씬 쉽게 확인할 수 있습니다.

이 포럼에서 답변을 공유해 주신 모든 분들께 감사드립니다.

행복한 코딩!

 

도움이 되셨나요?

또한 Metatrader 주문을 명령줄에서 실행할 수 있는지 알고 싶습니다. 또는 일반적으로 일종의 API를 사용하여 Metatrader와 외부 응용 프로그램을 인터페이스할 수 있는 경우입니다.

감사해요

제프