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

 

안녕하세요 Roger09님,

도움을 주셔서 다시 한 번 감사드립니다. 내 목표는 스크립트를 사용하여 손절매 를 매수 거래에서 플러스 x 핍을 손익분기점으로 이동하거나 매도 거래에서 마이너스 x 핍을 손익분기점으로 이동하는 것입니다. 나는 거래가 나에게 유리하게 움직일 때 약간의 이익을 빠르게 잠글 수 있도록 스크립트에 대한 단축키를 설정했습니다. 일부 ES'에 이 기능이 있다는 것을 알고 있지만 수동으로 수행할 수 있도록 스크립트를 사용하는 것을 선호합니다.

 

구매 중지 및 판매 중지 프로그래밍

여보세요,

저는 CCI가 있는 EA를 사용합니다.

내 프로그램은 선행 막대가 CCI>100 이상일 때 매수를 설정했지만 마지막 막대에서 5핍을 더 높게 사고 싶습니다.

나는 중지 판매 주문과 같은 것을 원합니다(마지막 최저점에서 5핍)

여기 내 EA, 도와줄 수 있니?

감사해요

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

//| 이 MQL은 Expert Advisor Builder에 의해 생성됩니다.

//| MetaTrader 4용 Expert Advisor 빌더 |

//| |

/+------- 이 헤더를 제거하지 마십시오 --------------------+

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"

#속성 링크 "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

외부 정수 MagicNumber = 0;

extern bool SignalMail = 거짓;

extern bool EachTickMode = False;

extern 이중 로트 = 1.0;

extern int 미끄러짐 = 30;

extern bool UseStopLoss = True;

extern int 손절매 = 200;

extern bool UseTakeProfit = True;

extern int TakeProfit = 600;

extern bool UseTrailingStop = True;

extern int TrailingStop = 250;

int BarCount;

정수 현재;

bool TickCheck = 거짓;

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

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

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

정수 초기화() {

BarCount = 막대;

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

리턴(0);

}

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

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

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

정수 초기화() {

리턴(0);

}

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

//| 전문가 시작 기능 |

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

정수 시작() {

정수 순서 = SIGNAL_NONE;

int 합계, 티켓;

이중 StopLossLevel, TakeProfitLevel;

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

총계 = OrdersTotal();

주문 = SIGNAL_NONE;

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

//| 변수 시작 |

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

이중 Var1 = iCCI(NULL, 0, 20, PRICE_CLOSE, 현재 + 0);

이중 변수2 = iCCI(NULL, 0, 20, PRICE_CLOSE, 현재 + 1);

이중 구매1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, 현재 + 0);

이중 구매1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, 현재 + 1);

이중 구매2_1 = Var1 ;

이중 구매2_2 = 100;

이중 구매3_1 = Var2 ;

이중 구매3_2 = 100;

이중 Sell1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, 현재 + 0);

이중 Sell1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, 현재 + 1);

이중 Sell2_1 = Var1 ;

이중 판매2_2 = - 100;

이중 Sell3_1 = Var2 ;

이중 Sell3_2 = - 100;

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

//| 변수 끝 |

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

//위치 확인

bool IsTrade = 거짓;

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

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

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

IsTrade = 사실;

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

//닫다

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

//| 시그널 비긴(Exit Buy) |

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

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

//| 시그널 종료(Exit Buy) |

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

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

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

if (SignalMail) SendMail("[신호 경고]", "[" + Symbol() + "] " + DoubleToStr(입찰가, 숫자) + " 매수 종료");

if (!EachTickMode) BarCount = 막대;

IsTrade = 거짓;

계속하다;

}

//후행 정지

if(UseTrailingStop && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = 막대;

계속하다;

}

}

}

} 또 다른 {

//닫다

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

//| 시그널 비긴(Exit Sell) |

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

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

//| 시그널 종료(엑시트 매도) |

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

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

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

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = 막대;

IsTrade = 거짓;

계속하다;

}

//후행 정지

if(UseTrailingStop && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = 막대;

계속하다;

}

}

}

}

}

}

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

//| 시그널 비긴(진입) |

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

if (구매1_1 > 구매1_2 && 구매2_1 > 구매2_2 && 구매3_1 <= 구매3_2) 주문 = SIGNAL_BUY;

if (Sell1_1 < Sell1_2 && Sell2_1 Sell3_2) 주문 = SIGNAL_SELL;

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

//| 신호 종료 |

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

//구입하다

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

if(!IsTrade) {

// 여유 여백 확인

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

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

리턴(0);

}

if (UseStopLoss) StopLossLevel = 묻기 - StopLoss * 포인트; 그렇지 않으면 StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = 묻기 + TakeProfit * 포인트; 그렇지 않으면 TakeProfitLevel = 0.0;

티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(티켓 > 0) {

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

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

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} 또 다른 {

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

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

//팔다

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

if(!IsTrade) {

// 여유 여백 확인

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

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

리턴(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * 포인트; 그렇지 않으면 StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = 입찰가 - TakeProfit * 포인트; 그렇지 않으면 TakeProfitLevel = 0.0;

티켓 = OrderSend(Symbol(), OP_SELL, lot, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(티켓 > 0) {

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

Print("SELL order open : ", OrderOpenPrice());

if (SignalMail) SendMail("[신호 경고]", "[" + Symbol() + "] " + DoubleToStr(입찰가, 숫자) + " 공개 매도");

} 또 다른 {

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

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

}

if (!EachTickMode) BarCount = 막대;

리턴(0);

}

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

 
tk748:
안녕하세요 Roger09, 도움을 주셔서 다시 한 번 감사드립니다. 내 목표는 스크립트를 사용하여 손절매를 매수 거래에서 플러스 x 핍을 손익분기점으로 이동하거나 매도 거래에서 마이너스 x 핍을 손익분기점으로 이동하는 것입니다. 나는 거래가 나에게 유리하게 움직일 때 약간의 이익을 빠르게 잠글 수 있도록 스크립트에 대한 단축키를 설정했습니다. 일부 ES'에 이 기능이 있다는 것을 알고 있지만 수동으로 수행할 수 있도록 스크립트를 사용하는 것을 선호합니다.

정류장을 한 번만 설정해야 하는 경우 이 EA 코드를 사용하세요.

extern int pips=10;//

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

//| 스크립트 프로그램 시작 기능 |

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

정수 시작()

{

//----

int ot = 주문 합계();

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

{

int o = 주문 선택(i, SELECT_BY_POS);

if (OrderSymbol() == Symbol()&&OrderType() <2)

{

이중 sl = 0;

if (OrderType() == OP_BUY&& OrderStopLoss() =pips*Point)

sl = OrderOpenPrice() +핍*포인트;

if (OrderType() == OP_SELL && (OrderStopLoss() > OrderOpenPrice()||OrderStopLoss()==0)

&&OrderOpenPrice()-Ask>=핍*포인트)

sl = OrderOpenPrice() -핍*포인트;

(!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0))

Print("오류_수정 - ",GetLastError());

}

}

//----

반환(0);

}

 
cgassfr67:
여보세요,

저는 CCI가 있는 EA를 사용합니다.

내 프로그램은 선행 막대가 CCI>100을 넘을 때 매수를 설정했지만 마지막 막대에서 5핍을 더 높게 사고 싶습니다.

나는 중지 판매 주문과 동일한 것을 원합니다(마지막 최저점에서 5핍)

여기 내 EA, 도와줄 수 있니?

감사해요

바꾸다

double Buy1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Buy1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Buy2_1 = Var1 ;

double Buy2_2 = 100;

double Buy3_1 = Var2 ;

double Buy3_2 = 100;

double Sell1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Sell1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Sell2_1 = Var1 ;

double Sell2_2 = - 100;

double Sell3_1 = Var2 ;

double Sell3_2 = - 100;[/CODE]

To

[CODE]

double Buy1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Buy1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Buy2_1 = Var1 ;

double Buy2_2 = 105;

double Buy3_1 = Var2 ;

double Buy3_2 = 105;

double Sell1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Sell1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Sell2_1 = Var1 ;

double Sell2_2 = - 105;

double Sell3_1 = Var2 ;

double Sell3_2 = - 105;
 
Roger09:
바꾸다
double Buy1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Buy1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Buy2_1 = Var1 ;

double Buy2_2 = 100;

double Buy3_1 = Var2 ;

double Buy3_2 = 100;

double Sell1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Sell1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Sell2_1 = Var1 ;

double Sell2_2 = - 100;

double Sell3_1 = Var2 ;

double Sell3_2 = - 100;[/CODE]

To

[CODE]

double Buy1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Buy1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Buy2_1 = Var1 ;

double Buy2_2 = 105;

double Buy3_1 = Var2 ;

double Buy3_2 = 105;

double Sell1_1 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 0);

double Sell1_2 = iMA(NULL, 0, 55, 0, MODE_EMA, PRICE_CLOSE, Current + 1);

double Sell2_1 = Var1 ;

double Sell2_2 = - 105;

double Sell3_1 = Var2 ;

double Sell3_2 = - 105;

예, 하지만 이 코드를 사용하면 다음 막대가 열릴 때 입력하고 다음 막대가 증가할 것이라고 확신하므로 마지막 고점에서 5핍으로 구매해야 합니다.

 

시간외 거래

안녕하세요- 저는 하루 중 시간을 기준으로 EA를 호출하려고 합니다. 오전 5시와 오후 5시 또는 30분마다 등

어떻게 할 수 있습니까?

도움을 주셔서 감사합니다.

케빈

 

이것이 도움이 될 수 있습니다.

if((TimeHour(TimeLocal())!=5&&TimeMinute(TimeLocal())!=0)||(TimeHour(TimeLocal())!=17

&&TimeMinute(TimeLocal( ) )!=0))return();

start() 시작 부분에 넣으십시오.

 

누군가 이것을보고 작동하지 않는 이유를 알려주십시오.

댓글로 활용하려고 합니다.

더블 AvgWin()

{

이중 CountTrades = 0;

이중 CountPips = 0;

for(int Ticket=0;Ticket<OrdersHistoryTotal();Ticket++)

{

OrderSelect(티켓,SELECT_BY_TICKET,MODE_HISTORY);

if(MyAccount==AccountNumber() && OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)

{

//-------->>>>

if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice())

CountTrades++;

{

if(OrderProfit() >= 0)

카운트 핍++;

}

if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice())

CountTrades++;

{

if(OrderProfit() >= 0)

카운트 핍++;

}

}

}

if(카운트 핍 < 0)

return(MathRound(CountPips/CountTrades)*10);

또 다른

Print("실시간 AvgWin을 사용할 수 없습니다.");

반환(mAvgWin);

}

 

우선 교체

SELECT_BY_TICKET에서 SELECT_BY_POS로

둘째, CountPips는 항상 0보다 큽니다.

 
Roger09:
우선 교체

SELECT_BY_TICKET에서 SELECT_BY_POS로

둘째, CountPips는 항상 0보다 큽니다.

이거 괜찮아

정수 AvgWin()

{

정수 CountTrades = 0;

정수 CountPips = 0;

for(int Ticket=0;Ticket<OrdersHistoryTotal();Ticket++)

{

OrderSelect(티켓,SELECT_BY_POS,MODE_HISTORY);

if(MyAccount==AccountNumber() && OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)

{

//-------->>>>

if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice())

CountTrades++;

{

if(OrderProfit() >= 0)

카운트 핍++;

}

if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice())

CountTrades++;

{

if(OrderProfit() >= 0)

카운트 핍++;

}

}

}

if(카운트 핍 > 0)

return(MathRound(CountPips/CountTrades)*10);

또 다른

Print("실시간 AvgWin을 사용할 수 없습니다.");

반환(mAvgWin);

}