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

 

...

이 게시물을 확인하십시오 : https://www.mql5.com/en/forum/174385/page12

비슷한 문제에 관한 것이었고 동일한 countOpenedOnACurrentBar 를 사용할 수 있습니다.

크로스오버당 하나의 거래만 열도록 제한하는 기능

dipu:
안녕하세요 친구들, 저는 뉴비입니다. 간단한 전략이 있습니다. 난 그냥 스캘핑 때 EMA 크로스오버. 나는 모든 크로스오버에서 단 하나의 거래만 받습니다. 모든 EMA 크로스오버에서 한 번만 거래할 수 있는 코드가 필요합니다. 제발......
 

단순히 EMA 크로스오버 코드가 필요합니다........

정말 고마워요, MLADEN ...

난 그냥 당신 의 기능 을 확인 합니다 . 좋아 보인다. 나도 도움이 필요해. EMA 크로스오버와 함께 RSI(50) 값 을 추가해야 합니다. 어떻게 해야 합니까..?

쌍: GBP/USD 및 EUR/USD

시간 프레임: 15분, 1시간 이상;

-------------------------------------------

매수: EMA 5 EMA 12를 상향 돌파, RSI가 50 이상

매도: EMA 5 EMA 12를 하방으로 교차, RSI 50 미만

(모든 EMA 크로스오버에서 하나의 거래만)

답변을 기다리고 있습니다. 제발.......

 

몇 가지 방법으로 할 수 있습니다.

한 가지 방법(EA에서 직접)은 다음과 같을 수 있습니다.

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

필요한 모든 정보가 있습니다. 회색 선은 "추세"입니다. 초록색 선과 빨간색 선은 입장 및 재진입 지점으로 사용할 수 있습니다. 시각적으로 즉시 "최적화"한 다음 EA에서 해당 매개변수 를 사용할 수 있습니다(고통스러운 "매개변수를 변경하고 실행하고 얻은 내용을 확인한 다음 동일한 작업을 반복"하는 것보다 시각적으로 훨씬 빠른 "최적화"). EA에서 호출하는 것이 다소 쉽습니다.

[PHP] 이중 추세c = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

이중 경향 p = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (추세!=추세)

{

if (trendc== 1) ... 매수 신호

if (trendc==-1) ... 매도 신호

}

따라서 대체로 저는 항상 Ea의 표시기 사용법을 사용하는 것이 좋습니다. 내 생각에는 EA가 주문 및 자금 관리를 위한 "그냥" 프레임워크인 경우 표시기 코드를 변경하고 수정하는 것만으로도 건드리지 않고 E의 논리를 변경할 수도 있습니다. EA를 사용하는 가장 효율적인 방법입니다. 지표도 부착하여 Ea에서 사용할 방식(직접 또는 "지표별" 방식)을 결정합니다.

추신: 위의 예에서 테스트는 현재(아직 열려 있는) 막대에서 수행됩니다. 닫힌 막대를 테스트하려면 iCustom(), iMa() 및 iRSI()를 호출할 때 0과 1을 1로 바꾸십시오.

dipu:
정말 고마워요, MLADEN ...

난 그냥 당신의 기능을 확인합니다. 좋아 보인다. 나도 도움이 필요해. EMA 크로스오버와 함께 RSI(50) 값 을 추가해야 합니다. 어떻게 해야 합니까..?

쌍: GBP/USD 및 EUR/USD

시간 프레임: 15분, 1시간 이상;

-------------------------------------------

매수: EMA 5 EMA 12를 상향 돌파, RSI가 50 이상

매도: EMA 5 EMA 12를 하방으로 교차, RSI 50 미만

(모든 EMA 크로스오버에서 하나의 거래만)

답변을 기다리고 있습니다. 제발.......
파일:
 

이달 1일 잔고?

Gidday 나는 화면 표시를 위해 매월 1일의 시작 잔액을 추출하는 방법이 있는지 알아 내려고 여기 앉아 있었습니다.

내가하려는 것은 첫 번째 잔액과 현재 잔액 사이의 백분율 차이를 얻는 것입니다.

나는 전체 백분율 차이가 있습니다.

(잔액-예금)/예금*100

월별 차액을 추가하고 싶습니다.

(잔액 - 1차)/1차*100

힌트 팁이나 실제 코드가 있으면 좋습니다.

건배

베노

 

다시 한 번 감사합니다, MALADEN ...

지표와 조언에 감사드립니다. 나는 단지 당신의 지시를 따르려고 노력할 뿐입니다. 하지만 mq4에 익숙하지 않아서 실패했습니다..........

여기, 내 것이요..............

------------------------------------

-----------------------------------

#속성 표시기_분리_창

#속성 표시기_버퍼 3

#property indicator_color1 라임그린

#property indicator_color2 창백한 바이올렛레드

#property indicator_color3 다크그레이

#속성 표시기_너비1 2

#속성 표시기_너비2 2

#속성 표시기_최소 -1.1

#속성 표시기_최대 +1.1

외부 정수 EmaFast = 5;

외부 정수 EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

외부 정수 RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

이중 가입[];

이중 부호[];

이중 추세[];

외부 이중 TakeProfit=15.0;

외부 이중 로트=0.1;

//------------------------------------------------ ------------------

//

//------------------------------------------------ ------------------

정수 초기화()

{

리턴(0);

}

//------------------------------------------------ ------------------

//

//------------------------------------------------ ------------------

정수 시작()

{

int count,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

int limit = MathMin(바-카운트된_바,바-1);

int cnt, 티켓, 합계;

이중 경향 c = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

이중 경향 p = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (추세!=추세)

총계 = OrdersTotal();

if(총 < 1)

{

if (trendc== 1) //... 매수 신호

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"내 EA",12345,0,Green);

if(티켓>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());

}

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

리턴(0);

}

if (trendc==-1) //... 매도 신호

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"내 EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(" SELL 주문 이 열렸습니다 : ",OrderOpenPrice());

}

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

리턴(0);

}

}

리턴(0);

}

---------------------------------------

---------------------------------------

당신의 도움이 필요합니다....

당신이 방해가 될 때 내가 당신에게 더 많은 측면을했다면 당신에게 사과했습니다. 근데 정말 무기력...

답변을 기다리고 있습니다. 제발.......

 

...

다음과 같이 사용해 보세요.

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth는 잔액 0을 현재 달로 보고자 하는 이전 달입니다. 그런 다음 필요한 달의 1일에 잔액이 얼마인지 계산합니다. 이 기능 은 입금 및 출금도 고려하므로(OrderType() == 6) 정상적으로 작동해야 합니다.

Beno:
Gidday 나는 화면 표시를 위해 매월 1일의 시작 잔액을 추출하는 방법이 있는지 알아 내려고 여기 앉아 있었습니다.

내가하려는 것은 첫 번째 잔액과 현재 잔액 사이의 백분율 차이를 얻는 것입니다.

나는 전체 백분율 차이가 있습니다.

(잔액-예금)/예금*100

월별 차액을 추가하고 싶습니다.

(잔액 - 1차)/1차*100

힌트 팁이나 실제 코드가 있으면 좋습니다.

건배

베노
 

...

인디케이터에서 주문을 관리할 수 없습니다. 스크립트 또는 EA(귀하가 찾고 있는 경우)에서만 주문을 관리할 수 있습니다. 게시물의 코드는 지표입니다.

내가 게시한 예는 EA에서 사용됩니다(내가 이해하는 한 귀하는 이미 주문 수 를 제한하고 항목에 대한 ema 및 rsi 조건을 테스트하려는 EA가 있는 것으로 알고 있습니다).

dipu:
다시 한 번 감사합니다, MALADEN ...

지표와 조언에 감사드립니다. 나는 단지 당신의 지시를 따르려고 노력할 뿐입니다. 하지만 mq4에 익숙하지 않아서 실패했습니다.............

여기, 내 것이요..............

------------------------------------

-----------------------------------

#속성 표시기_분리_창

#속성 표시기_버퍼 3

#property indicator_color1 라임그린

#property indicator_color2 창백한 바이올렛레드

#property indicator_color3 다크그레이

#속성 표시기_너비1 2

#속성 표시기_너비2 2

#속성 표시기_최소 -1.1

#속성 표시기_최대 +1.1

외부 정수 EmaFast = 5;

외부 정수 EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

외부 정수 RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

이중 가입[];

이중 부호[];

이중 추세[];

외부 이중 TakeProfit=15.0;

외부 이중 로트=0.1;

//------------------------------------------------ ------------------

//

//------------------------------------------------ ------------------

정수 초기화()

{

리턴(0);

}

//------------------------------------------------ ------------------

//

//------------------------------------------------ ------------------

정수 시작()

{

int count,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

int limit = MathMin(바-카운트된_바,바-1);

int cnt, 티켓, 합계;

이중 경향 c = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

이중 경향 p = iCustom(NULL,0,"ema + rsi 바이너리",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (추세!=추세)

총계 = OrdersTotal();

if(총 < 1)

{

if (trendc== 1) //... 매수 신호

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"내 EA",12345,0,Green);

if(티켓>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());

}

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

리턴(0);

}

if (trendc==-1) //... 매도 신호

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"내 EA",12345,0,Red);

if(티켓>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("판매 주문이 열렸습니다: ",OrderOpenPrice());

}

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

리턴(0);

}

}

리턴(0);

}

---------------------------------------

---------------------------------------

당신의 도움이 필요합니다....

당신이 방해를 받았을 때 내가 당신에게 더 많은 측면을했다면 당신에게 사과했습니다. 근데 정말 무기력...

답변을 기다리고 있습니다. 제발.......
 

MLADEN님 , 답변 감사합니다.

죄송합니다. 그 코드를 새 EA에 넣으라고 말씀하신 것 같습니다.

당신의 대답을 이해하고 그냥 그리워....

네. 당신 말이 맞아....

EA가 있고 수정하고 싶었습니다. 새로운 조건으로.......

내 상태는 다음과 같습니다

-------------------------------------------------- ----

매수: EMA 5 EMA 12를 상향 돌파, RSI가 50 이상

매도: EMA 5 EMA 12를 하방으로 교차, RSI 50 미만

출구: 작은 이익실현으로

(모든 EMA 크로스오버에서 단 하나의 거래만)

여기 내 EA.....

----------------------

----------------------

외부 이중 로트=0.1;

외부 정수 TakeProfit=5;

extern int StopLoss = 5;

extern int RSIPos=50;

extern int RSINeg=50;

extern int 미끄러짐=2;

extern int 포기 = 101;

날짜 시간 막대 시간 = 0;

정수 바틱 = 0;

더블 피;

정수 cnt=0;

정수 OrdersPerSymbol=0;

이중 황소MA3=0;

이중 곰MA7=0;

이중 RSI=0;

부울 RSIPOS=0;

부울 RSINEG=0;

이중 TP;

더블 SL;

정수 초기화()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60; 손절매 = 23; 포기=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95; 손절매=141; 포기=33;}

if (Symbol()=="EURCHF") {TakeProfit= 81; 손절매 = 77; 포기=97;}

if (Symbol()=="EURGBP") {TakeProfit= 11; 손절매 = 77; 포기=108;}

if (Symbol()=="EURJPY") {TakeProfit= 38; 손절매 = 75; 포기=183;}

if (Symbol()=="EURUSD") {TakeProfit=35; 손절매 = 35; 포기=5;}

if (Symbol()=="GBPCHF") {TakeProfit= 79; 손절매 = 98; 포기=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13; 손절매 = 98; 포기=117;}

if (Symbol()=="GBPUSD") {TakeProfit= 55; 손절매=100; 포기=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66; 손절매 = 76; 포기=106;}

if (Symbol()=="USDCHF") {TakeProfit=117; 손절매 = 78; 포기=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53; 손절매 = 74; 포기=110;}

}

정수 초기화()

{

}

정수 시작()

{

p=포인트;

// 오류 검사 및 막대 계산

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY"); 반환(0);}

if(Bars<100) {Print("-----NO BARS "); 반환(0);}

if(bartime!=시간[0]) {bartime=시간[0]; 바틱++;}

BullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);

bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1);

RSI=iRSI(심볼(),0,2,PRICE_CLOSE,2);

if(RSI>RSIPos) {RSIPOS=참; RSINEG=거짓;}

if(RSI<RSINeg) {RSIPOS=거짓; RSINEG=참;}

OrdersPerSymbol=0;

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

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

if( 주문 기호()== 기호() )

{

OrdersPerSymbol++;

}

}

if(OrdersPerSymbol==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"BUY"+CurTime(),0,0,흰색);

바틱=0;

}

if(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=입찰가+(손절매*p);

TP=입찰가-(이익실현*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"SELL"+CurTime(),0,0,Red);

바틱=0;

}

}

if(OrdersPerSymbol==1 && bartick== 포기)

{

if(주문 유형()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White);

SL=입찰가+(손절매*p);

TP=입찰가-(이익실현*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"SELL"+CurTime(),0,0,Red);

바틱++;

}

if(주문 유형()==OP_SELL)

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red);

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"BUY"+CurTime(),0,0,흰색);

바틱++;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

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

if( 주문 기호()== 기호() )

{

if(주문 유형()==OP_BUY)

{

if (OrderMagicNumber()==0)

{

if( Bid-OrderOpenPrice() > 3*Point )

{

OrderClose(OrderTicket(),Lots,Bid,0,White);

리턴(0);

}

}

}

if(주문 유형()==OP_SELL)

{

if (OrderMagicNumber()==0)

{

if( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red);

리턴(0);

}

}

}

}

}

리턴(0);

}

-------------------

----------------------

어떻게 수정하나요....? 응답을 기다리는. 제발.......

 

디푸

항목에 관한 한 이것은 정상적으로 작동합니다.

이제 귀하가 작성한 방식으로 출구를 처리하십시오. 너무 빨리 주문을 마감하고 있습니다. 또한 5자리 중개인도 지금 처리하고 있으며 항목이 제대로 작동하고 있습니다. rsi의 기본 기간은 14로 설정됩니다(어떤 것을 사용하고 싶은지 몰랐습니다. 코드에서 기간 2를 사용 하지만 아마도 짧을 것입니다). Ema 기간은 기본적으로 5와 12입니다. 또한 현재 닫힌 막대를 테스트하고 있습니다(막대가 닫힐 때까지 기다렸다가 매수/매도 신호가 있으면 주문에 들어갑니다).

파일:
dipu.mq4  5 kb
 

MLADEN님 , 답변 감사합니다.

명확한 정보가 없어 죄송합니다.......

매수: EMA 5 EMA 12를 상향 돌파, RSI[14] 50 이상

매도: EMA 5 EMA 12를 하방으로 교차, RSI[14] 50 미만

출구: 작은 TP/Sl....(5pip)

(모든 EMA 크로스오버에서 단 하나의 거래만)

나는 그것을 시도하고 결과를 알려줄 것입니다....

수정도 가능할까요.. 아님..

다시한번 도와주셔서 감사합니다.....