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

 

매수만, 매도 없음

수익성 있는 EA를 만들지만 지금은 매수만 하고 매도 주문은 하지 않기 때문에 두 배는 더 좋을 수 있습니다(아마도).

왜 그런지 아는 사람?

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

//| 신호 시작 |

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

double sig_buy = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

 

전체 코드를 게시하세요. 또 다른 문제가 있습니다...

두 번째 단계는 아마도 iCustom() 함수일 것 입니다.

panteraschoice:
수익성 있는 EA를 만들지만 지금은 매수만 하고 매도 주문은 하지 않기 때문에 두 배는 더 좋을 수 있습니다(아마도).

왜 그런지 아는 사람?

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

//| 신호 시작 |

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

이중 sig_buy = iCustom(NULL, 0, "경사 방향 선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

미래 날짜에 개체 배치 및 보기?

안녕하세요, MQL4가 표시기 개체를 미래에 배치하고 미래 개체 보기를 지원하는지 아는 사람이 있습니까? 미래 날짜로 ObjectMove를 시도했지만(오류 반환 없음) 마지막 눈금 날짜에서 표시가 중지됩니다. 감사해요

 

MA에는 교대 기능이 있습니다... 그게 당신이 의미하는 것이라면. +2는 2개의 TF 막대를 앞으로 밉니다. -2는 2 뒤로 미끄러집니다.

 
IN10TION:
전체 코드를 공개합니다. 또 다른 문제가 있습니다. 두 번째 단계는 아마도 iCustom() 함수일 것입니다.

#속성 링크 "https://www.forex-tsd.com"

외부 정수 MagicNumber = 1001;

extern bool EachTickMode = False;

extern 이중 로트 = 0.01;

extern int 미끄러짐 = 4;

extern bool StopLossMode = True;

extern int 손절매 = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

외부 이중 최대 위험 = 0;//0.15

extern 이중 DecreaseFactor = 3;

외부 정수 MaxOrders = 3000;

extern bool UseHourTrade = False;

외부 int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

정수 현재;

bool TickCheck = 거짓;

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

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

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

정수 초기화() {

BarCount = 막대;

if (EachTickMode) 현재 = 0; 그렇지 않으면 현재 = 1;

리턴(0);

}

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

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

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

정수 초기화() {

리턴(0);

}

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

//| 전문가 시작 기능 |

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

정수 시작() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("거래의 시간이 오지 않았습니다!");

리턴(0);

}

}

정수 주문 = SIGNAL_NONE;

int 합계, 티켓;

이중 StopLossLevel, TakeProfitLevel;

정수 숫자 = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

총계 = OrdersTotal();

주문 = SIGNAL_NONE;

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

//| 신호 시작 |

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

double sig_buy = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

//구입하다

if (주문 == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (바 != BarCount)))) {

if(ScanTrades() < MaxOrders) {

// 여유 여백 확인

if (AccountFreeMargin() < (1000 * 랏)) {

Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());

리턴(0);

}

StopLossLevel = 묻기 - StopLoss * 포인트;

TakeProfitLevel = 묻기 + TakeProfit * 포인트;

티켓 = OrderSend(Symbol(), OP_BUY, LotOptimized(),

NormalizeDouble(묻기, 숫자),

미끄러짐,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"구매(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(티켓 > 0) {

if (OrderSelect(티켓, SELECT_BY_TICKET, MODE_TRADES)) Print("구매 주문이 열렸습니다: ", OrderOpenPrice()); else Print("구매 주문 열기 오류: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

//팔다

if (주문 == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (막대 != BarCount))) {

if(ScanTrades() < MaxOrders) {

// 여유 여백 확인

if (AccountFreeMargin() < (1000 * 랏)) {

Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());

리턴(0);

}

StopLossLevel = 입찰가 + 손절매 * 포인트;

TakeProfitLevel = 입찰가 - TakeProfit * 포인트;

티켓 = OrderSend(Symbol(), OP_SELL, LotOptimized(),

NormalizeDouble(입찰가, 숫자),

미끄러짐,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"판매(#" + 매직넘버 + ")", 매직넘버, 0, 딥핑크);

if(티켓 > 0) {

if (OrderSelect(티켓, SELECT_BY_TICKET, MODE_TRADES)) Print(" SELL 주문 이 열렸습니다 : ", OrderOpenPrice()); else Print("판매 주문 열기 오류: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

//위치 확인

for (int i = 0, i < 총계, i ++) {

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

if(주문 유형() <= OP_SELL && 주문 기호() == 기호()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//닫다

if (주문 == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (막대 != BarCount))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

//후행 정지

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > 포인트 * TrailingStop) {

if(OrderStopLoss() < 입찰 - 포인트 * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), 입찰 - 포인트 * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

}

} 또 다른 {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//닫다

if (주문 == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (바 != BarCount)))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

//후행 정지

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - 묻기) > (포인트 * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), 묻기 + 포인트 * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

int ScanTrades()

{

정수 합계 = OrdersTotal();

정수 숫자 = 0;

for(int cnt=0; cnt<전체; cnt++)

{

주문 선택(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

숫자++;

}

반환(숫자);

}

//bool ExistPositions() {

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

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// 반환(참);

// }

// }

// }

// 반환(거짓);

//}

이중 LotOptimized()

{

이중 로트 = 로트;

int 주문 = HistoryTotal(); // 히스토리 주문 합계

정수 손실 = 0; // 중단 없는 손실 주문 수

//---- 로트 크기 선택

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- 중단 없이 손실 주문 수를 계산합니다.

if(감소인자>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("기록에 오류가 있습니다!"); 부서지다; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 계속;

//----

if(OrderProfit()>0) 휴식;

if(OrderProfit()<0) 손실++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- 반환 로트 크기

if(lot<0.1) lot=0.1;

반환(로트);

}

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

 

무슨 일이 일어나고 있는지 힌트를 주는 오류 코드 나 다른 것(백테스팅에서)이 있습니까?

panteraschoice:
#속성 링크 "https://www.forex-tsd.com"

외부 정수 MagicNumber = 1001;

extern bool EachTickMode = False;

extern 이중 로트 = 0.01;

extern int 미끄러짐 = 4;

extern bool StopLossMode = True;

extern int 손절매 = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

외부 이중 최대 위험 = 0;//0.15

extern 이중 DecreaseFactor = 3;

외부 정수 MaxOrders = 3000;

extern bool UseHourTrade = False;

외부 int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

정수 현재;

bool TickCheck = 거짓;

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

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

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

정수 초기화() {

BarCount = 막대;

if (EachTickMode) 현재 = 0; 그렇지 않으면 현재 = 1;

리턴(0);

}

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

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

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

정수 초기화() {

리턴(0);

}

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

//| 전문가 시작 기능 |

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

정수 시작() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("거래의 시간이 오지 않았습니다!");

리턴(0);

}

}

정수 주문 = SIGNAL_NONE;

int 합계, 티켓;

이중 StopLossLevel, TakeProfitLevel;

정수 숫자 = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

총계 = OrdersTotal();

주문 = SIGNAL_NONE;

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

//| 신호 시작 |

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

이중 sig_buy = iCustom(NULL, 0, "경사 방향 선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

//구입하다

if (주문 == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (막대 != BarCount)))) {

if(ScanTrades() < MaxOrders) {

// 여유 여백 확인

if (AccountFreeMargin() < (1000 * 랏)) {

Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());

리턴(0);

}

StopLossLevel = 묻기 - StopLoss * 포인트;

TakeProfitLevel = 묻기 + TakeProfit * 포인트;

티켓 = OrderSend(Symbol(), OP_BUY, LotOptimized(),

NormalizeDouble(묻기, 숫자),

미끄러짐,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"구매(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(티켓 > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("구매 주문이 열렸습니다: ", OrderOpenPrice()); else Print("구매 주문 열기 오류: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

//팔다

if (주문 == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (막대 != BarCount))) {

if(ScanTrades() < MaxOrders) {

// 여유 여백 확인

if (AccountFreeMargin() < (1000 * 랏)) {

Print("돈이 없습니다. Free Margin = ", AccountFreeMargin());

리턴(0);

}

StopLossLevel = 입찰가 + 손절매 * 포인트;

TakeProfitLevel = 입찰가 - TakeProfit * 포인트;

티켓 = OrderSend(Symbol(), OP_SELL, LotOptimized(),

NormalizeDouble(입찰가, 숫자),

미끄러짐,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"판매(#" + 매직넘버 + ")", 매직넘버, 0, 딥핑크);

if(티켓 > 0) {

if (OrderSelect(티켓, SELECT_BY_TICKET, MODE_TRADES)) Print("SELL 주문이 열렸습니다: ", OrderOpenPrice()); else Print("판매 주문 열기 오류: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

//위치 확인

for (int i = 0, i < 총계, i ++) {

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

if(주문 유형() <= OP_SELL && 주문 기호() == 기호()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//닫다

if (주문 == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (막대 != BarCount))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

//후행 정지

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > 포인트 * TrailingStop) {

if(OrderStopLoss() < 입찰 - 포인트 * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), 입찰 - 포인트 * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

}

} 또 다른 {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//닫다

if (주문 == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (바 != BarCount)))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

//후행 정지

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - 묻기) > (포인트 * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), 묻기 + 포인트 * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

int ScanTrades()

{

정수 합계 = OrdersTotal();

정수 숫자 = 0;

for(int cnt=0; cnt<전체; cnt++)

{

주문 선택(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

숫자++;

}

반환(숫자);

}

//bool ExistPositions() {

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

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// 반환(참);

// }

// }

// }

// 반환(거짓);

//}

이중 LotOptimized()

{

이중 로트 = 로트;

int 주문 = HistoryTotal(); // 히스토리 주문 합계

정수 손실 = 0; // 중단 없는 손실 주문 수

//---- 로트 크기 선택

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- 중단 없이 손실 주문 수를 계산합니다.

if(감소인자>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("기록에 오류가 있습니다!"); 부서지다; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 계속;

//----

if(OrderProfit()>0) 휴식;

if(OrderProfit()<0) 손실++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- 반환 로트 크기

if(lot<0.1) lot=0.1;

반환(로트);

}

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

저는 지금 RSIFilter로만 백테스트를 하고 있습니다. 이 스레드에서 몇 년 전에 RSIMixFilter를 사용하고 해당 지표를 게시했으며 BUYS 및 SELLS를 얻었으므로 BUY 및 SELL 주문을 수행하는 논리는 괜찮습니다. 문제는 iCustom 신호에 있습니다...

RSImixFilter 는 이 스레드에 없습니다. 죄송합니다. 여기 있습니다.

panteraschoice:
수익성 있는 EA를 만들지만 지금은 매수만 하고 매도 주문은 하지 않기 때문에 두 배는 더 좋을 수 있습니다(아마도).

왜 그런지 아는 사람?

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

//| 신호 시작 |

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

이중 sig_buy = iCustom(NULL, 0, "경사 방향 선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

2007년 4월부터 지금까지 EURUSD H1이라는 백테스팅 을 이 RSImixFilter만 사용하여 ...

모델링 품질이 90%여야 하는데 왜 안 나오는지 모르겠네요.

panteraschoice:
수익성 있는 EA를 생성하지만 지금은 매수만 배치되고 매도 주문은 하지 않기 때문에 두 배는 더 좋을 수 있습니다(아마도).

왜 그런지 아는 사람?

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

//| 신호 시작 |

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

double sig_buy = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 0, 0);

이중 sig_sell = iCustom(NULL, 0, "경사 방향선",40, 2, 0, 1, 0);

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) 주문 = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

//+----------------------------------------------- -------------------+
파일:
 

백테스팅 은 매수와 매도를 하였습니까, 아니면 그 중 하나만 주었습니까? 저와 함께 구매만 했습니다(또는 코드를 변경한 경우에만 판매).

나는 실제로 오류를 보여주는 것을 본 적이 없습니다.

 
IN10TION:
저는 지금 RSIFilter로만 백테스트를 하고 있습니다. 이 스레드에서 몇 년 전에 RSIMixFilter를 사용하고 해당 지표를 게시했으며 BUYS 및 SELLS를 얻었으므로 BUY 및 SELL 주문을 수행하는 논리는 괜찮습니다. 문제는 iCustom 신호에 있습니다...

그래서 이것은 괜찮습니까?

이중 Sg=iCustom(NULL,0,"RSIFilter_v1",5,5,0,1);

if ( Sg>0) 주문 = SIGNAL_BUY;

if (Sg<0) 주문 = SIGNAL_SELL;