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

 

이 EA의 iCustom 기능에 대한 도움이 필요하면 사용자 지정 표시기를 호출할 수 있습니다.

안녕하세요, 여러분,

이 (Entry.mq4) indi를 이 (swb grid 4.1.0.3_EA) EA에 추가하고 싶습니다.

iCustom 기능이 있으므로 나와 우리는 이 지표를 EA의 전략에 사용할 수 있습니다.

EA는 이미 3개의 MT4 지표인 Bollinger Bands , Stochastic 및 RSI를 사용하고 있으며

TRUE 또는 FALSE를 선택하여 사용할 스위치 중 하나 또는 모두를 선택할 수 있습니다.

그리고 이 4번째 인디(Entry.mq4)를 EA에 추가하고 싶습니다.

누구든지 나를 도울 수 있다면 대단히 감사하겠습니다.

감사합니다.

EA 및 인디 첨부 벨로우즈.

파일:
 

이 어레이를 이해하는 데 필요한 멍청한 MQL4 도움말

안녕, 코더들

누구든지 배열에 대해 조금 가르쳐 주실래요?

또는 이 배열과 관련된 루프를 이해하는 데 더 많은 문제가 있습니다.

int i=바;

#property copyright "Unfinished POS by Agent86"

이중 v1[];

이중 v2[];

이중 val1;

이중 val2;

정수 시작()

{

동안(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

만약 (val1 > 0)

{

v1=높음;

}

또 다른

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

만약 (val2 > 0)

{

v2=낮음;

}

그렇지 않으면 v2=v2;

나--;

}

반환(0);

}

기본 프랙탈이지만 배열의 어떤 요소도 참조할 수 없는 것 같습니다.

어떻게 든 i ++를 증가시키고 Print (v1)를 할 수 있기를 원합니다. 또는 0 또는 EMPTY_VALUE 이전의 이전 값을 인쇄하십시오.

내가 이것으로 올바른 방향으로 가고 있다면.

문제가 있어요.

인쇄(v1): 항상 == 0이고 0을 인쇄합니다.

나는 그것이 실제로 == 0인 -1까지 반복되기 때문에 일종의 이해합니다.

어떻게 그리고 어디에 무슨 일이 일어나는지 볼 수 있도록 Print 문을 넣을 수 있습니까?

여러 가지 또는 방법을 시도하고 i=0을 다시 초기화하여 루프를 시도하고 교체하여 v1 요소를 참조할 수 있지만 모든 시도가 실패했습니다.

기본적으로 나는 이전 프랙탈을 보거나 EA의 ABCD 체계 유형에서 가능한 미래 사용을 위해 A 높음, B 낮음 등으로 표시하고 싶습니다.

지금은 주로 v1이 무엇을 하는지 볼 수 있도록 Print v1을 원합니다.

아마도 A_high 및/또는 B_low와 같은 이전 프랙탈 또는 그러한 구성표를 선택하기 위해 무언가를 설계할 수 있습니다.

내가 잘못된 길을 가고 있습니까?

조언 부탁드립니다

감사해요

 

대신 A FOR 루프를 사용하겠습니다. while 루프는 i--를 포함하는 것을 잊은 경우 잠금으로 이어질 수 있습니다. 막대의 정확한 수 를 알고 있기 때문에 사용하기가 더 쉬우며 i는 결코 < 0이 아닙니다. 혼동을 피하는 데 도움이 됩니다.

(int i=Bars-1;i>0;i--) {

// 코드

}

모든 배열 값을 0으로 설정한 다음 다시 돌아가서 표시기 값을 할당하십시오. 또한 지표 값을 할당한 직후에 print()를 시도하십시오. 실제로 아무 것도 반환하지 않는지 확인하십시오.

내 생각에 가장 좋은 방법은 실제로 배열에 크기를 할당하는 것입니다. 1000개의 위치를 말합니다. 그렇게 많이 필요하지 않을 뿐만 아니라 수행하는 계산도 줄어듭니다. 그런 다음 마지막 999개 막대를 반복하여 0으로 만들고 값을 할당하기만 하면 됩니다. MT4에는 어레이 초기화 등에 문제가 있는 것으로 기억합니다.

 

배열 질문

Trader5050-Deployed:
대신 A FOR 루프를 사용하겠습니다. while 루프는 i--를 포함하는 것을 잊은 경우 잠금으로 이어질 수 있습니다. 막대의 정확한 수를 알고 있으므로 사용하기가 더 쉽고 i는 절대 < 0이 아닙니다. 혼동을 피하는 데 도움이 됩니다.

(int i=Bars-1;i>0;i--) {

// 코드

}

모든 배열 값을 0으로 설정한 다음 다시 돌아가서 표시기 값을 할당하십시오. 또한 지표 값을 할당한 직후에 print()를 시도하십시오. 실제로 아무 것도 반환하지 않는지 확인하십시오.

내 생각에 가장 좋은 방법은 실제로 배열에 크기를 할당하는 것입니다. 1000개의 위치를 말합니다. 그렇게 많이 필요하지 않을 뿐만 아니라 수행하는 계산도 줄어듭니다. 그런 다음 마지막 999개 막대를 반복하여 0으로 만들고 값을 할당하기만 하면 됩니다. MT4에는 어레이 초기화 등에 문제가 있는 것으로 기억합니다.

알겠습니다. 시도해 보겠습니다.

while 문은 잘 작동하지만 인쇄/보기 등을 원하는 배열 요소 를 가져오는 데 도움이 되지 않습니다.

말씀하신 내용을 확인하고 테스트를 해보고 다시 글을 올리도록 하겠습니다.

감사해요

 
Trader5050-Deployed:
대신 A FOR 루프를 사용하겠습니다. while 루프는 i--를 포함하는 것을 잊은 경우 잠금으로 이어질 수 있습니다. 막대의 정확한 수를 알고 있으므로 사용하기가 더 쉽고 i는 절대 < 0이 아닙니다. 혼동을 피하는 데 도움이 됩니다.

(int i=Bars-1;i>0;i--) {

// 코드

}

모든 배열 값을 0으로 설정한 다음 다시 돌아가서 표시기 값을 할당하십시오. 또한 지표 값을 할당한 직후에 print()를 시도하십시오. 실제로 아무 것도 반환하지 않는지 확인하십시오.

내 생각에 가장 좋은 방법은 실제로 배열에 크기를 할당하는 것입니다. 1000개의 위치를 말합니다. 그렇게 많이 필요하지 않을 뿐만 아니라 수행하는 계산도 줄어듭니다. 그런 다음 마지막 999개 막대를 반복하여 0으로 만들고 값을 할당하기만 하면 됩니다. MT4에는 어레이 초기화 등에 문제가 있는 것으로 기억합니다.

여전히 모든 0 항목으로 배열을 인쇄합니다.

이상한

 

아르젠트86,

코드에 몇 가지 오류가 있습니다.

- 사용 중인 배열은 아직 배열이 아니므로(코드에서와 같이 배열 크기를 지정하지 않으면 동적 배열이고 배열 크기는 런타임에 관리되어야 함) 크기가 0인 배열이 있습니다. (그것이 항상 0을 갖는 첫 번째 이유입니다 - 치명적인 오류를 방지하고 그러한 경우 결과로 0을 반환하는 메타 트레이더 오류 처리 루틴입니다 - C/C++에서는 충돌을 일으킬 것입니다)

- 배열이 "시리즈 유사"라고 지정하지 않은 경우("시리즈 유사"에서 0번째 요소는 마지막 요소이고 일반 배열에서는 0번째 요소가 첫 번째 요소임) 따라서 표현식 i+1은 배열의 다음 요소입니다. 그 경우는 이전이 아닙니다. "시리즈와 같은" 방식으로 배열을 사용할 수 있지만 런타임에 작동하려면 몇 가지 작업을 더 수행해야 하며, 막대 번호가 변경되더라도 크롤링 코드를 받게 되므로 네이티브에서 배열을 사용하는 것이 더 좋습니다 - "C like" 모드

- 또한 새 눈금의 세 번째 막대에서 시작해야 합니다(즉, 현재 막대가 아니라 새 프랙탈 이 나타나는 곳임).


다음은 이러한 문제 없이 수행하려는 작업입니다.
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

다음을 사용하여 MQ4 a dll 함수에서 액세스: 변수-인수 목록

안녕,

이것이 가능한지 누구나 압니다: a를 인수로 사용하는 dll 함수를 가져오려면: 변수-인수 목록

예: vprintf - C++ 참조

int vprintf( const char * 형식, va_list 인수);

그렇다면 어떻게 하시겠습니까?

감사해요

엠제이

 

반환 값이 없는 함수 를 호출하는 방법

안녕하세요 가이즈 앤 걸스입니다.

내 프로그램의 어느 시점에서 함수를 호출하고 싶습니다.

그러나 함수에는 반환 값이 없습니다(void). 함수를 호출하는 방법은 다음과 같습니다.

그래서 그것은 내가 호출한 곳에서 정확히 함수 내부의 코드를 실행합니다.

마치 그 장소 자체에 쓰여진 것처럼?

나는 아래에 몇 가지 예제 코드를 만들었습니다. 여기서 일부 매개 변수를 확인하고 Ok이면 함수를 실행하고 싶습니다.

누군가가 나를 도울 수 있기를 바랍니다. 미리 보내주세요. Jonkie76

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

//| 전문가 시작 기능 |

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

정수 시작()

{

//----

if (가격 >= PRICE_CLOSE)

호출 기능 ; // 이 시점에서 함수를 호출하고 싶습니다. 어떻게 합니까?

또 다른

Alert("아무것도 하지 않음"); //

//----

리턴(0);

}

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

//================================================== =====================+

//함수

//================================================== =====================+

//----------------------- 주문 마감 기능 ---------------------- +

무효 subCloseOrder()

{

정수

나,

총 = 0,

티켓 = 0,

오류 = 0,

c = 0;

총계 = OrdersTotal();

for(i=total-1;i>=0;i--)

{

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

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==매직)

{

스위치(주문 유형())

{

케이스 OP_BUY:

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(오류==0)

{

if(티켓>0) 휴식;

}

또 다른

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //사용 중 오류

{

수면(5000);

계속하다;

}

else //정상 오류

{

if(티켓>0) 휴식;

}

}

}

부서지다;

}

}

}

}

 

아주 간단합니다. 무언가를 반환할 것이므로 호출하기만 하면 됩니다. void 유형에는 결과가 전혀 없기 때문에 결과를 저장할 필요가 없습니다. (아무것도 반환하지 않음) 다음과 같이:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

대신 "void"를 사용하십시오. 이와 같이 :

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void는 함수 에서 값을 반환하지 않고 효과적으로 함수가 아닌 프로시저가 됨을 의미합니다.

Jonkie76:
안녕하세요 가이즈 앤 걸스입니다.

내 프로그램의 어느 시점에서 함수를 호출하고 싶습니다.

그러나 함수에는 반환 값이 없습니다(void). 함수를 호출하는 방법은 다음과 같습니다.

그래서 그것은 내가 호출한 곳에서 정확히 함수 내부의 코드를 실행합니다.

마치 그 장소 자체에 쓰여진 것처럼?

나는 아래에 몇 가지 예제 코드를 만들었습니다. 여기서 일부 매개 변수를 확인하고 Ok이면 함수를 실행하고 싶습니다.

누군가가 나를 도울 수 있기를 바랍니다. 미리 보내주세요. Jonkie76

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

//| 전문가 시작 기능 |

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

정수 시작()

{

//----

if (가격 >= PRICE_CLOSE)

호출 기능 ; // 이 시점에서 함수를 호출하고 싶습니다. 어떻게 합니까?

또 다른

Alert("아무것도 하지 않음"); //

//----

리턴(0);

}

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

//================================================== =====================+

//함수

//================================================== =====================+

//----------------------- 주문 마감 기능 ---------------------- +

무효 subCloseOrder()

{

정수

나,

총 = 0,

티켓 = 0,

오류 = 0,

c = 0;

총계 = OrdersTotal();

for(i=total-1;i>=0;i--)

{

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

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==매직)

{

스위치(주문 유형())

{

케이스 OP_BUY:

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(오류==0)

{

if(티켓>0) 휴식;

}

또 다른

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //사용 중 오류

{

수면(5000);

계속하다;

}

else //정상 오류

{

if(티켓>0) 휴식;

}

}

}

부서지다;

}

}

}

}