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

 

표시기 레벨 라인에 색상, 스타일 및 무게를 추가할 수 있습니까?

안녕,

표시기 수준 선에 색상, 스타일 및 무게를 추가하는 것이 가능한지 누군가가 말해 줄 수 있는지 궁금합니다.

우선 RSI 레벨에 스타일과 색상을 모두 지정하고 싶습니다. 예를 들어 #property indicator_level1 70 행에 코드를 더 추가하여 이를 수행할 수 있는지 궁금합니다.

가능하다면 누군가가 저를 보여줄 수 있다면 정말 감사하겠습니다.

감사해요,

라우루스

 

...

그래 넌 할수있어

다음 속성을 사용합니다.

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
안녕,

표시기 레벨 라인에 색상, 스타일 및 무게를 추가하는 것이 가능한지 누군가가 말해 줄 수 있는지 궁금합니다.

우선 RSI 레벨에 스타일과 색상을 모두 지정하고 싶습니다. 예를 들어 #property indicator_level1 70 행에 코드를 더 추가하여 이를 수행할 수 있는지 궁금합니다.

가능하다면 누군가가 저를 보여줄 수 있다면 정말 감사하겠습니다.

감사해요,

라우루스
 

Mladen에 대한 귀하의 답변에 감사드립니다. 귀하의 도움은 항상 대단히 감사합니다.

당신이 쓴 것이 바로 내가 두려워했던 것입니다. 기능 부분에 관해서는 여전히 내 머리 위에 있습니다.

사진을 보시면 제가 원하는 모습이 보일겁니다. 절충안으로 일반 수평선 을 사용했지만 지표 자체로 추세선을 그리기 때문에 좋은 솔루션이 아닙니다.

감사해요,

라우루스

파일:
 

...

사진을 보면 (오브젝트 사용) 적용할 수 있는 유일한 솔루션인 것 같습니다. 그리기 버퍼 를 사용하면 단순히 그리기 버퍼를 소모하고 해당 표시기에서 사용 중인 모든 값을 그릴 수 없습니다. 때때로 우리는 메타 트레이더가 8개의 드로잉 버퍼를 갖기로 한 결정에 대해 여전히 "지불"하고 있습니다.

Laurus12:
Mladen, 귀하의 도움에 항상 감사드립니다.

당신이 쓴 것이 바로 내가 두려워했던 것입니다. 기능 부분에 관해서는 여전히 내 머리 위에 있습니다.

사진을 보시면 제가 원하는 모습을 알 수 있습니다. 절충안으로 일반 수평선을 사용했지만 지표 자체로 추세선을 그리기 때문에 좋은 솔루션이 아닙니다.

감사해요,

라우루스
 

외부 DLL이 이상한 결과를 반환함

안녕!

다음은 외부 DLL에 대한 호출의 매우 간단한 예입니다. 저널 로그는 전략 테스터 와 함께 사용할 때 0부터 시작하는 증가하는 숫자를 보여야 합니다.

그러나 결과는 꽤 이상합니다. 저널 로그의 첫 번째 행은 큰 숫자(예: 18472)를 표시한 다음 한 번에 약 10단계, 때로는 100단계 이상으로 점프하기 시작할 때까지 잠시 동안 적절하게 증가합니다.

누군가 나에게 이것에 대한 이유와 수정 방법을 설명할 수 있습니까?

감사해요!

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

표시기에 대한 흥미로운 코드 문제

안녕하세요 여러분,

저는 MT4 프로그래밍을 배우려고 노력 중이고 바로 이 순간 PinBar 감지 표시기를 개발 중입니다. 나는 매수 또는 매도에 대한 특별한 규칙 때문에 특히 4시간 차트를 위해 이 지표를 개발했습니다. 탐지 규칙은 다음과 같습니다.

양초 본체 <= 양초 길이의 35%.

최소 1심지 양초 >= 양초 길이의 50%.

지금까지 표시기로 해당 막대를 감지하는 데 문제가 없습니다.

그러나 다음 규칙은 매수 또는 매도를 지시합니다.

1시간 차트를 확대하고 4시간 차트에서 핀바를 생성한 4개의 막대를 봅니다.

iClose 기능 을 사용하여 1시간 막대에서 해당 대형의 첫 번째 막대와 마지막 막대의 마감 값을 가져왔습니다.

그러나..지금 프로그래밍된 대로 저는 항상 1시간 차트 자체의 첫 번째 캔들과 마지막 캔들을 봅니다. 그리고 그것은 괜찮지 않습니다. 차트가 아니라 포메이션의 첫 번째이자 마지막 막대여야 합니다.

다음은 잘못된 iClose 기능이 포함된 코드입니다.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4) )

{

Buy = Close;

SetLevel(true,i+1,Close);

}

나는 그 특정 4시간 촛불의 배경에 올바른 1시간 촛불을 고정할 수 없었습니다.

내 문제에 대한 답을 줄 수 있는 사람이 있습니까?

고쳤다:

날짜 시간 H4BarTime;

int H1BarNumber;

H4BarTime = 시간;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

아주 많이!

야곱

 
mladen:
사진을 보면 (오브젝트 사용) 적용할 수 있는 유일한 솔루션인 것 같습니다. 그리기 버퍼를 사용하면 단순히 그리기 버퍼를 소모하고 해당 표시기에서 사용 중인 모든 값을 그릴 수 없습니다. 때때로 우리는 메타 트레이더가 8개의 드로잉 버퍼를 갖기로 한 결정에 대해 여전히 "지불"하고 있습니다.

Mladen의 늦은 답변에 대해 죄송하고 문제를 명확히 해 주셔서 감사합니다. 당신이 쓴 것과 관련하여 적어도 지금은 확실히 알고 있습니다.

고맙습니다,

라우루스

 

참가 기준에 대한 도움말

안녕하세요 여러분,

MA를 사용하여 입학 기준을 올리려고 합니다. 내 진입 기준은 간단합니다. 현재 캔들 대신 캔들 종가에서 빠른 MA가 슬로우 MA를 상향 교차할 때 매수 거래를 시작하고 싶습니다.

내 현재 상황은 빠른 MA가 느린 MA를 위쪽으로 교차할 때 내 EA가 긴 거래를 트리거하지만 그 반대의 경우도 마찬가지입니다. 특정 거래를 촉발하지 말았어야 하는 거래가 계속해서 위로 교차했기 때문에 시스템이 거래를 촉발했습니다. 이것은 숏 트레이드의 경우에도 동일합니다.

나는 어떤 진전도 없이 벌써 며칠 동안 이것에 대해 계속하고 있다. 누군가 이 작업을 수행하는 방법에 대해 밝힐 수 있습니까? 감사해요.

//--- 입력 매개변수

외부 이중 TakeProfit=2700.0;

외부 이중 로트=0.1;

외부 이중 StopLoss=2500.0;

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

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

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

정수 초기화()

{

//----

//----

리턴(0);

}

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

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

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

정수 초기화()

{

//----

//----

리턴(0);

}

int 교차 (이중 line1 , double line2)

{

정적 int last_direction = 0;

정적 int 현재 방향 = 0;

if(line1>line2)current_dirction = 1; //위로

if(줄1<줄2)현재방향 = 2; //아래에

if(current_dirction != last_direction) //변경됨

{

마지막 방향 = 현재 방향;

반환(last_direction);

}

또 다른

{

리턴(0);

}

}

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

//| 전문가 시작 기능 |

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

정수 시작()

{

//----

int cnt, 티켓, 합계;

더블 shortEma, longEma;

if(막대<100)

{

Print("100개 미만의 막대");

리턴(0);

}

if(테이크프로핏<10)

{

Print("TakeProfit이 10 미만입니다.");

리턴(0); // TakeProfit 확인

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 교차(shortEma,longEma);

총계 = OrdersTotal();

if(총 < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print(" SELL 주문 이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

리턴(0);

}

리턴(0);

}

리턴(0);

}

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

감사합니다

테런스

 

...

테런스

다음 행을 변경해 보십시오.

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

그렇게하면 교차 기능 이 필요하지 않으며 닫힌 막대에서 십자가를 확인합니다.

tkuan77:
안녕하세요 여러분,

MA를 사용하여 입학 기준을 올리려고 합니다. 내 진입 기준은 간단합니다. 현재 캔들 대신 캔들 종가에서 빠른 MA가 슬로우 MA를 상향 교차할 때 매수 거래를 시작하고 싶습니다.

내 현재 상황은 빠른 MA가 느린 MA를 위쪽으로 교차할 때 내 EA가 긴 거래를 트리거하지만 그 반대의 경우도 마찬가지입니다. 특정 거래를 촉발하지 말았어야 하는 거래가 계속해서 위로 교차했기 때문에 시스템이 거래를 촉발했습니다. 이것은 숏 트레이드의 경우에도 동일합니다.

나는 어떤 진전도 없이 벌써 며칠 동안 이것에 대해 계속하고 있다. 누군가 이 작업을 수행하는 방법에 대해 밝힐 수 있습니까? 감사해요.

//--- 입력 매개변수

외부 이중 TakeProfit=2700.0;

외부 이중 로트=0.1;

외부 이중 StopLoss=2500.0;

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

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

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

정수 초기화()

{

//----

//----

리턴(0);

}

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

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

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

정수 초기화()

{

//----

//----

리턴(0);

}

int 교차 (이중 line1 , double line2)

{

정적 int last_direction = 0;

정적 int 현재 방향 = 0;

if(line1>line2)current_dirction = 1; //위로

if(줄1<줄2)현재방향 = 2; //아래에

if(current_dirction != last_direction) //변경됨

{

마지막 방향 = 현재 방향;

반환(last_direction);

}

또 다른

{

리턴(0);

}

}

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

//| 전문가 시작 기능 |

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

정수 시작()

{

//----

int cnt, 티켓, 합계;

더블 shortEma, longEma;

if(막대<100)

{

Print("100개 미만의 막대");

리턴(0);

}

if(테이크프로핏<10)

{

Print("TakeProfit이 10 미만입니다.");

리턴(0); // TakeProfit 확인

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 교차(shortEma,longEma);

총계 = OrdersTotal();

if(총 < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"내 EA",12345,0,녹색);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("구매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("구매 주문 열기 오류: ",GetLastError());

리턴(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point,"My EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(티켓,SELECT_BY_TICKET,MODE_TRADES))

Print("판매 주문이 열렸습니다 : ",OrderOpenPrice());

}

else Print("판매 주문 열기 오류: ",GetLastError());

리턴(0);

}

리턴(0);

}

리턴(0);

}

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

감사합니다

테런스
 
mladen:
테런스

다음 행을 변경해 보십시오.

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

그렇게하면 교차 기능이 필요하지 않으며 닫힌 막대에서 십자가를 확인합니다.

안녕 Mladen, 나는 당신이 나에게 말한 것을 시도했고 그것은 경이롭게 작동합니다. 그러나 코드 뒤에 있는 논리를 잘 이해하지 못합니다. 왜 iMA의 시프트를 1과 2로 설정하고 이것을 코딩합니까: (diff1*diff2)<0)도 마찬가지입니까? 죄송하지만 저는 현재 여전히 학습 문구를 사용하고 있습니다.

감사합니다

테런스

사유: