초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 100

 

안녕하세요 여러분, 고문의 코드에서 오류를 찾도록 도와주세요. 모든 것을 살펴본 것 같습니다. 모든 것이 코드에 올바르게 작성된 것 같지만 어떤 이유로 프로그램이 올바르게 거래되지 않습니다! 아이디어는 다음과 같습니다. 가격이 가격을 깨면 EA는 같은 방향의 두 개의 긴 양초를 찾아야 합니다(양초 사이의 길이는 EA에서 규제됩니다. 즉, 방향에 따라 두 개의 최소 또는 최대 양초 사이) 반대 방향의 마지막 양초의 최소 또는 최대, 거래가 시작되어야 합니다(파일에 첨부된 차트의 상황 사진 예시). EA는 각각의 적절한 상황에서 거래를 개시해야 하며, 어떤 이유에서인지 날짜 사이의 거래 창에서만 거래를 엽니다. 이것은 프로그래머에게 어렵지 않은 상황입니다. 도와주세요. 오류를 수정하십시오. 아래의 어드바이저 코드와 첨부파일을 참고하세요.


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

//| Spacing_Candles.mq4 |

//| Copyright 2017, 블라디미르 |

//| vk.com/id229534564 |

//| 메일: Vladim120385@yandex.ru |

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

#property copyright "Copyright 2017, Vladim"

#속성 링크 "vk.com/id229534564"

#속성 버전 "1.00"

#속성엄격


//--- EA 매개변수

외부 문자열 paramEA = ""; // 매개변수 EA

외부 이중 볼륨 = 0.01; // 용량

외부 이중 stopLoss = 5; // 정지 손실

외부 이중 takeProfit = 1.5; // 이익을 취하다

외부 이중 maxSpacing = 150; // 최대 간격

외부 이중 minSpacing = 30; // 최소 간격

extern 이중 후행 정지 = 0; // 후행 정지

외부 정수 마법 = 127; // 마법


//--- 전역 변수

날짜 시간 newCandle;

인팁;


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

int OnInit()

{

반환(INIT_SUCCESSED);

}

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

무효 OnDeinit(const int 이유)

{

}

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

무효 OnTick()

{

if(newCandle != 시간[0]) FindPattern();

newCandle = 시간[0];

}

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

void OpenOrder(int type) // 시장가 주문을 엽니다.

{

if(유형 == OP_BUY) if(OrderSend(_Symbol, OP_BUY, 볼륨, 묻기, 0, 0, 0, "", 매직, 0)) SetSLTP(OP_BUY);

if(유형 == OP_SELL) if(OrderSend(_Symbol, OP_SELL, 볼륨, 입찰가, 0, 0, 0, "", 매직, 0)) SetSLTP(OP_SELL);

}

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

void SetSLTP(int type) // 중지 주문 설정

{

이중 sl = 0;

이중tp = 0;

if(유형 == OP_BUY)

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

if(주문선택(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == 마법 && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(낮음[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - 낮음[1]) * takeProfit, 자릿수);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) 반환;

}

if(유형 == OP_SELL)

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

if(주문선택(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == 마법 && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (높음[1] - OrderOpenPrice()) * takeProfit, 자릿수);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) 반환;

}

}

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

void FindPattern() // 양초 사이의 먼 거리 찾기

{

if(높음[1] < 높음[2] && 입찰가 > 높음[1] && 낮음[1] < 낮음[2])

{

이중 간격 = NormalizeDouble((High[2] - High[1]) / _Point, 0);

if(maxSpacing >= 간격 && minSpacing <= 간격)

오픈 오더(OP_BUY);

}

if(낮음[1] > 낮음[2] && 입찰가 < 낮음[1] && 높음[1] > 높음[2])

{

이중 간격 = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

if(maxSpacing >= 간격 && minSpacing <= 간격)

오픈오더(OP_SELL);

}

{

if (TrailingStop!=0) TrailingStop();

}

}

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

무효 TrailingStop()

{

이중 StLo, OSL, OOP;

부울 오류=참;

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

{

if (OrderSelect(i, SELECT_BY_POS))

{

팁 = 주문 유형();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(), 숫자);

OOP = NormalizeDouble(OrderOpenPrice(), 숫자);

if (팁==0)

{

StLo = NormalizeDouble(입찰가 - TrailingStop*Point,Digits);

(StLo < OOP) 계속하면;

if(StLo>OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,흰색);


}

만약 (팁==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);

(StLo > OOP) 계속하면;

if (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,흰색);

}

if (!error) Alert("오류 TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

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

파일:
 
Vladim1203 :

안녕하세요 여러분, 고문의 코드에서 오류를 찾도록 도와주세요. 모든 것을 살펴본 것 같습니다. 모든 것이 코드에 올바르게 작성된 것 같지만 어떤 이유로 프로그램이 올바르게 거래되지 않습니다! 아이디어는 다음과 같습니다. 가격이 가격을 깨면 EA는 같은 방향의 두 개의 긴 양초를 찾아야 합니다(양초 사이의 길이는 EA에서 규제됩니다. 즉, 방향에 따라 두 개의 최소 또는 최대 양초 사이) 반대 방향의 마지막 양초의 최소 또는 최대, 거래가 시작되어야 합니다(파일에 첨부된 차트의 상황 사진 예시). EA는 각각의 적절한 상황에서 거래를 개시해야 하며, 어떤 이유에서인지 날짜 사이의 거래 창에서만 거래를 엽니다. 이것은 프로그래머에게 어렵지 않은 상황입니다. 도와주세요. 오류를 수정하십시오. 아래의 어드바이저 코드와 첨부파일을 참고하세요.

아마도 이미 충분할 것입니다. 각 주제에 게시물을 생성하고 동시에 자신의 게시물을 만들었습니다.

 
kuzhakov :

안녕하세요.
어드바이저의 거래를 시간별로 제한하는 방법을 알려주세요.
포럼에서 여러 방법을 시도해 보았지만 아무 일도 일어나지 않았고, 글로 써도 전혀 이해가 되지 않았습니다.
손가락으로 무언가를 삽입할 위치를 직접 찌르는 것이 좋습니다.


시작 후 넣어. 전문가는 터미널에서 지정된 시간 간격으로 매일 거래합니다.


 int val= Hour ();
 double min= Minute ();
 double Dl = val + min/ 100 ;  
 double L = xxxx+xxxx/ 100 ; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/ 100 ; //час + минуты вместо хххх - это конец времени
 if (Dl<L) return ;
 if (Dl>P) return ;
 
Vladim1203 :

안녕하세요 여러분, 고문의 코드에서 오류를 찾도록 도와주세요. 모든 것을 살펴본 것 같습니다. 모든 것이 코드에 올바르게 작성된 것 같지만 어떤 이유로 프로그램이 올바르게 거래되지 않습니다! 아이디어는 다음과 같습니다. 가격이 가격을 깨면 EA는 같은 방향의 두 개의 긴 양초를 찾아야 합니다(양초 사이의 길이는 EA에서 규제됩니다. 즉, 방향에 따라 두 개의 최소 또는 최대 양초 사이) 반대 방향의 마지막 양초의 최소 또는 최대, 거래가 시작되어야 합니다(파일에 첨부된 차트의 상황 사진 예시). EA는 각각의 적절한 상황에서 거래를 개시해야 하며, 어떤 이유에서인지 날짜 사이의 거래 창에서만 거래를 엽니다. 이것은 프로그래머에게 어렵지 않은 상황입니다. 도와주세요. 오류를 수정하십시오. 아래의 어드바이저 코드와 첨부파일을 참고하세요.


매수 및 매도 진입 조건 확인

 
Vladim1203 :

안녕하세요 여러분, 고문의 코드에서 오류를 찾도록 도와주세요. 모든 것을 살펴본 것 같습니다. 모든 것이 코드에 올바르게 작성된 것 같지만 어떤 이유로 프로그램이 올바르게 거래되지 않습니다! 아이디어는 다음과 같습니다. 가격이 가격을 깨면 EA는 같은 방향의 두 개의 긴 양초를 찾아야 합니다(양초 사이의 길이는 EA에서 규제됩니다. 즉, 방향에 따라 두 개의 최소 또는 최대 양초 사이) 반대 방향의 마지막 양초의 최소 또는 최대, 거래가 시작되어야 합니다(파일에 첨부된 차트의 상황 사진 예시). EA는 각각의 적절한 상황에서 거래를 개시해야 하며, 어떤 이유에서인지 날짜 사이의 거래 창에서만 거래를 엽니다. 이것은 프로그래머에게 어렵지 않은 상황입니다. 도와주세요. 오류를 수정하십시오. 아래의 어드바이저 코드와 첨부파일을 참고하세요.

차트에서 발견 된 양초를 표시하도록 먼저 고문의 일부를 작성하는 것이 좋습니다. 모든 것이 명확해질 것입니다. 그리고 다음 행은 귀하의 경우 중복됩니다.

 extern string paramEA    = "" ;     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit ()
{
   
   return ( INIT_SUCCEEDED );
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

커뮤니티에 도움을 요청하는 중...
*
포럼에서 Kalman 필터 표시기를 다운로드했습니다(출처 첨부).
차트의 모든 것이 좋습니다.


다음 행을 사용하여 Expert Advisor에서 읽으려고 할 때



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

분명히 표시기와 관련이없는 동일한 큰 숫자를 출력합니다.

뭐가 될수 있었는지 ?

파일:
 
MikeZv :

커뮤니티에 도움을 요청하는 중...
*
포럼에서 Kalman 필터 표시기를 다운로드했습니다(출처 첨부).
차트의 모든 것이 좋습니다.


다음 행을 사용하여 Expert Advisor에서 읽으려고 할 때



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

분명히 표시기와 관련이없는 동일한 큰 숫자를 출력합니다.

뭐가 될수 있었는지 ?

EMPTY_VALUE

표시기 버퍼 의 빈 값

2147483647 (0x7FFFFFF)

 
Alekseu Fedotov :

EMPTY_VALUE

표시기 버퍼의 빈 값

2147483647 (0x7FFFFFF)


:) 이미 찾았습니다...
왜 나오나요?

 
MikeZv :

:) 이미 찾았습니다...
왜 나오나요?


표시기는 2개의 색상이 있기 때문에 2개의 배열을 갖습니다. 막대에 첫 번째 색상의 줄이 있는 동안 두 번째 색상의 배열은 EMPTY_VALUE 와 같습니다.

즉, 요청 후 iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);

iValue = EMPTY_VALUE, 막대 1의 선이 주황색임을 의미합니다. (파란색 배열 = EMPTY_VALUE이기 때문에)

 
Nikolay Ivanov :

표시기는 2개의 색상이 있기 때문에 2개의 배열을 갖습니다. 막대에 첫 번째 색상의 줄이 있는 동안 두 번째 색상의 배열은 EMPTY_VALUE 와 같습니다.

즉, 요청 후 iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);

iValue = EMPTY_VALUE, 막대 1의 선이 주황색임을 의미합니다. (파란색 배열 = EMPTY_VALUE이기 때문에)


고마워요 니콜라이...
나는 두 줄 모두에서 가져왔다.
그런 다음 그것들을 하나로 결합했습니다(왼쪽 버퍼 하나). 같은 결과입니다.
*
다음 질문이 생겼습니다.
표시기에는 변수 draw_begin=500이 있습니다. 즉, 차트가 그려지는 끝(가장 신선한 양초부터)부터 양초의 수입니다.
그리고 iCustom() 메서드를 사용하여 지표 값을 추출할 때 이 500개는 어떤 양초에서 계산됩니까?
왜 중요한가 - draw_begin은 그리기 뿐만 아니라 지표 계산에도 참여합니다...

사유: