저는 롱 포지션과 숏 포지션을 동시에 여는 EA에서 일하고 있는데 이 문제에 직면하고 있습니다... 두 가지 유형의 포지션이 모두 열릴 때 첫 번째 포지션은 숏 포지션이고 두 번째 포지션은 롱 포지션이라고 가정해 보겠습니다... EA는 롱 포지션을 청산하지 않을 것입니다 매도가 여전히 열려 있으면 매도가 닫힐 때까지 기다렸다가 조건이 충족되면 매수를 닫고 그 반대의 경우도 마찬가지입니다. 다음은 오픈 포지션을 마감해야 하는 EA의 일부입니다.
이것은 내 첫 번째 EA입니다. 그것은 3개의 시간 프레임에서 2개의 rsi의 교차를 사용합니다. 나는 ea가 십자가에 반대하는 거래를 하는 것에 문제가 있습니다. 팔려야 할 때 사고 사려고 할 때 팔아라. 누군가 코드를 보고 내가 어디에서 잘못되었는지 말해 주시겠습니까? 나는 잘못된 것을 볼 수 없었습니다.
fx시장이 24시간이라는 걸 알다시피, 나는 PC 앞에 앉아 있지 않고 밤새 거래하는 것이 편하지 않다. 그래서 가장 좋은 방법은 가격이 내가 좋아하는 방향으로 움직일 때 거래를 보호하는 프로그램이라고 생각합니다. 예를 들어, 총 5개의 랏을 열었을 때 이익이 50핍 이상이면 자동으로 손절매를 손익분기점으로 이동합니다. 이익이 100핍 이상이면 30핍 보호로 이동하고, 이익이 200핍 이상일 때 50핍 보호로 이동합니다. 등등.
나는 내 자신을 코딩하려고 노력했다. 하지만 차트로 드래그하여 실시간 거래로 설정하면 작동하지 않습니다. 내 코드를 보고 수정하는 데 도움을 줄 수 있는 기관이 있습니까? 감사합니다.
OrderComment()를 사용하여 거래를 식별할 때 주의하십시오. 때로는 브로커가 댓글에 문자를 추가합니다.
사용하는 것이 가장 좋습니다
if (StringFind(OrderComment(), UserComment, 0) > 0)
{
// OrderComment에서 찾은 UserComment로 식별된 주문
}
대신에
if (OrderComment() == UserComment)
{
// 주문은 UserComment로 식별될 수 있습니다.
// 브로커가 OrderComment를 변경하지 않은 경우
}
로버트정확히 ... 또한 때로는 EA에 코딩된 원래 주석이 너무 길어 플랫폼에서 잘릴 수 있습니다(나머지 주석이 "메모리"에 있는지 확실하지 않지만 주석 열에 표시되지 않음).
FerruFx
내 EA에 도움이 필요해
안녕,
저는 롱 포지션과 숏 포지션을 동시에 여는 EA에서 일하고 있는데 이 문제에 직면하고 있습니다... 두 가지 유형의 포지션이 모두 열릴 때 첫 번째 포지션은 숏 포지션이고 두 번째 포지션은 롱 포지션이라고 가정해 보겠습니다... EA는 롱 포지션을 청산하지 않을 것입니다 매도가 여전히 열려 있으면 매도가 닫힐 때까지 기다렸다가 조건이 충족되면 매수를 닫고 그 반대의 경우도 마찬가지입니다. 다음은 오픈 포지션을 마감해야 하는 EA의 일부입니다.
//---- 오픈 포지션 닫기
for(int cnt=0; cnt<전체; cnt++)
{
주문 선택(cnt, SELECT_BY_POS);
{
//-- 닫기 롱
if(OrderSymbol() == Symbol() && OrderType()==OP_BUY && rsi1>75 && rsi<75)
{
OrderClose(OrderTicket(),OrderLots(),Bid,5,Green);
LotL=로트;
}
//-- 닫기 닫기
if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && rsi125)
{
OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);
LotS=로트;
}
}
}
*여기서 rsi1은 이전 rsi이고 rsi는 현재 판독값입니다.
*LotL & LotS는 원래 Lot의 승수이며, 각 측면에서 최대 3개의 포지션을 열도록 설정했습니다. 따라서 한 유형의 열린 포지션을 닫을 때 LotL & LotS는 원래 크기로 재설정됩니다.
EA는 위치를 열 때 의도한 대로 작동하지만 문제는 열린 위치를 닫는 데 있습니다. 루프 부분의 EA가 모든 열린 위치를 읽는 것이 아니라 첫 번째 위치만 읽는다고 생각합니다... 이 문제를 해결하는 데 도움을 주시면 감사하겠습니다! !
건배!
피트
"Pips to activate Trailing stop" 기능을 추가하려고 합니다. 내가 변경한 것은 빨간색입니다. 그 밖에 추가해야 할 사항은 무엇입니까?
extern string Remark1 = "== Main Settings ==";
extern int MagicNumber = 54321;
extern bool SignalMail = False;
extern bool EachTickMode = true;
extern double Lots = 4;
extern int Slippage = 2;
extern bool UseStopLoss = false;
extern int StopLoss = 100;
extern bool UseTakeProfit = false;
extern int TakeProfit = 15;
extern bool UseTrailingStop = true;
extern int TrailingStop = 45;
extern double Pips_Activate_TS = 5;
extern bool MoveStopOnce = False;
extern int MoveStopWhenPrice = 50;
extern int MoveStopTo = 1;
extern int MaxConcurrentTrades = 2;
//Version 2.01
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() {
BarCount = Bars;
if (EachTickMode) Current = 0; else Current = 1;
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int Order = SIGNAL_NONE;
int Total, Ticket;
double StopLossLevel, TakeProfitLevel;
if (EachTickMode && Bars != BarCount) TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;
//+------------------------------------------------------------------+
//| Variable Begin |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Variable End |
//+------------------------------------------------------------------+
//Check position
bool IsTrade = False;
for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
IsTrade = True;
if(OrderType() == OP_BUY) {
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Signal End(Exit Buy) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//MoveOnce
if(MoveStopOnce && MoveStopWhenPrice > 0) {
if(Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice) {
if(OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo) {
OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + Point * MoveStopTo, OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Point * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
} else {
//Close
//+------------------------------------------------------------------+
//| Signal End(Exit Sell) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//MoveOnce
if(MoveStopOnce && MoveStopWhenPrice > 0) {
if(OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice) {
if(OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo) {
OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - Point * MoveStopTo, OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Signal Begin(Entry) |
//+------------------------------------------------------------------+
if(Open[0] > Open[0+1] &&
Open[0+1] >= Open[0+2] &&
Open[0+2]>= Open[0+3] &&
Open[0+3] >= Open[0+4] &&
Open[0+4] >= Open[0+5] &&
Open[0+5] >= Open[0+6]) Order = SIGNAL_SELL;
if(Open[0] < Open[0+1] &&
Open[0+1] <= Open[0+2] &&
Open[0+2]<= Open[0+3] &&
Open[0+3] <= Open[0+4] &&
Open[0+4] <= Open[0+5] &&
Open[0+5] <= Open[0+6]) Order = SIGNAL_BUY;
//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+
//Buy
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(DecideToOpenTrade(OP_BUY) && TradeSlotsAvailable()) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("BUY order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
} else {
Print("Error opening BUY order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
//Sell
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(DecideToOpenTrade(OP_SELL) && TradeSlotsAvailable()) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("SELL order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
} else {
Print("Error opening SELL order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
if (!EachTickMode) BarCount = Bars;
return(0);
}
거래처 여러분, 안녕하세요.
Custom 표시기에서 Expert Advisor를 개발하는 데 약간의 문제가 있습니다. "iCustom" 기능을 시도했지만 내 표시기는 항상 동일한 값을 반환합니다.
그것은 21473과 같은 것을 반환합니다 ..., 그와 같이
나는 EA가 언제 매도 및 매수 화살표 신호가 생성되는지 인식할 수 있기를 원하고 해당 거래 행동을 수행해야 합니다(즉, 지표가 상승할 때 매수하고 하락할 때 매도).
다음은 지표의 코드입니다. 누군가가 최대한 빨리 해결책을 제시할 수 있다면 정말 감사하겠습니다.iCustom() 함수 와 함께 코드 라인도 게시하십시오.
FerruFx
미안, 이게 내가 가진 전부야...
르시 이아
이것은 내 첫 번째 EA입니다. 그것은 3개의 시간 프레임에서 2개의 rsi의 교차를 사용합니다. 나는 ea가 십자가에 반대하는 거래를 하는 것에 문제가 있습니다. 팔려야 할 때 사고 사려고 할 때 팔아라. 누군가 코드를 보고 내가 어디에서 잘못되었는지 말해 주시겠습니까? 나는 잘못된 것을 볼 수 없었습니다.
나는 문제의 ea와 사진을 첨부했습니다.
EA 코드에 대한 도움이 필요합니다!
안녕하세요 여러분,
fx시장이 24시간이라는 걸 알다시피, 나는 PC 앞에 앉아 있지 않고 밤새 거래하는 것이 편하지 않다. 그래서 가장 좋은 방법은 가격이 내가 좋아하는 방향으로 움직일 때 거래를 보호하는 프로그램이라고 생각합니다. 예를 들어, 총 5개의 랏을 열었을 때 이익이 50핍 이상이면 자동으로 손절매를 손익분기점으로 이동합니다. 이익이 100핍 이상이면 30핍 보호로 이동하고, 이익이 200핍 이상일 때 50핍 보호로 이동합니다. 등등.
나는 내 자신을 코딩하려고 노력했다. 하지만 차트로 드래그하여 실시간 거래로 설정하면 작동하지 않습니다. 내 코드를 보고 수정하는 데 도움을 줄 수 있는 기관이 있습니까? 감사합니다.
#재산권 "x li"
#속성 링크 ""
#프로퍼티쇼_확인
//---- 입력 매개변수
외부 int target1 = 50;
외부 int target2 = 100;
외부 int target3 = 150;
외부 int target4 = 200;
외부 int target5 = 300;
외부 int 보호1 = 0;
외부 int 보호2 = 5;
외부 int 보호3 = 50;
외부 int 보호4 = 100;
//+----------------------------------------------- ------------------------------+
//| 스크립트 "스톱로스를 보호하기 위해 이동(50->0;100->5;150->50;200->50;300->100)" |
//+----------------------------------------------- ------------------------------+
정수 시작()
{
부울 결과;
이중 stop_loss, 포인트, EntryPrice, 이익;
int cmd, 총계, 오류, i;
//----
총계=주문총계();
point=MarketInfo(Symbol(),MODE_POINT);
//----
for(i=0; i<전체; i++)
{
if(주문선택(i,SELECT_BY_POS,MODE_TRADES))
{
cmd=주문 유형();
EntryPrice=OrderOpenPrice();
//---- 구매 주문이 고려됩니다.
if(cmd==OP_BUY)
{
이익=입찰가;
if(이익>목표1*포인트 && 수익<목표2*포인트)
{
stop_loss=EntryPrice+protect1*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표2*포인트 && 수익<목표3*포인트)
{
stop_loss=EntryPrice+protect2*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표3*포인트 && 수익<목표4*포인트)
{
stop_loss=EntryPrice+protect3*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표4*포인트 && 수익<목표5*포인트)
{
stop_loss=EntryPrice+protect3*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표5*포인트)
{
stop_loss=EntryPrice+protect4*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
}
//---- 판매 주문 이 고려됩니다.
if(cmd==OP_SELL)
{
이익=EntryPrice-Ask;
if(이익>목표1*포인트 && 수익<목표2*포인트)
{
stop_loss=EntryPrice-protect1*포인트;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표2*포인트 && 수익<목표3*포인트)
{
stop_loss=EntryPrice-protect2*point;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표3*포인트 && 수익<목표4*포인트)
{
stop_loss=EntryPrice-protect3*point;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표4*포인트 && 수익<목표5*포인트)
{
stop_loss=EntryPrice-protect3*point;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(이익>목표5*포인트)
{
stop_loss=EntryPrice-protect4*point;
결과=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
}
}
else { Print( "주문 선택 시 오류 발생 ", GetLastError()); 부서지다; }
}
//----
반환(0);
}
//+----------------------------------------------- -------------------+
르시 이아
왜 같은 변수를 사용하여 거래를 열고 닫는지 모르겠지만 작동할 수 있습니다.
이것이 문제일 수 있습니다.
"주문"은 전역 변수입니다. 따라서 시작 기능 을 통한 각 실행이 끝날 때 할당된 마지막 값으로 설정되고 다음 실행 시작에 해당 값을 사용합니다. 로컬로 만들면(Start 내부로 이동) 문제가 해결될 수 있습니다. 그렇지 않으면 마지막으로 사용한 후 재설정해야 합니다.
좋은 사냥,
빅비