Witam
To nie jest mój kod tylko go sobie przerobiłem z TrendFollowerRainbowMethod(yast77).
Prośba polega na tym, żeby gdy pojawi się strzałka kupna na wskaźniku Ema Crossower to ma kupić daną parę, a jeśli np po 20 minutach pojawi się strzałka czerwona to ma zamknąć kupno i otworzyć sprzedaż, i tak w koło.
Z góry dziękuję
Pozdrawiam
Dodano po 2 godzinach 29 minutach:
Zrobiłem to tak, ale mam błąd w linii 113
//---- input parameters
extern int iBarsAfterSignal=2;//2;
extern int iTakeProfit=17;
extern int iStopLoss=30;
extern int iTrailingStop=45;
extern int iStartTradingHour=1;//8;
extern int iEndTradingHour=23;//18;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Ema Crossover |
//+------------------------------------------------------------------+
int EmaCrossover()
{
//Calculate the last 2 bars before now
int iLastSignals[];
double fasterEMAnow, fasterEMAprevious, fasterEMAafter;
double slowerEMAnow, slowerEMAprevious, slowerEMAafter;
fasterEMAnow = iMA(NULL, 0, 4, 0, MODE_EMA, PRICE_CLOSE, 1);
fasterEMAprevious = iMA(NULL, 0, 4, 0, MODE_EMA, PRICE_CLOSE, 2);
slowerEMAnow = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE, 1);
slowerEMAprevious = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE, 2);
if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious))
{
return (1);
}
if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious))
{
return (-1);
}
return (0);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
if (Hour() <= iStartTradingHour || Hour() >= iEndTradingHour) return;
//Check for Ema signal
if( EmaCrossover() == 0 ) return;
if (EmaCrossover() == 1)
{
OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"",1337,0,Green);
}
if (EmaCrossover() == -1)
{
OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"",1337,0,Red);
}
return;
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
EmaCrossover(); // TU MAM BŁĄD HELP
{
double fasterEMAnow, fasterEMAprevious, fasterEMAafter;
double slowerEMAnow, slowerEMAprevious, slowerEMAafter;
//---- check for history and trading
if (Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
if (CalculateCurrentOrders(Symbol()) != 0)
{
if(OrderType()==OP_BUY)
{
if EmaCrossover() == (1)
{
OrderClose( OrderTicket(), 1, Ask, 3, Red) &&
OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"",1337,0,Red);
}
}
if(OrderType()==OP_SELL)
{
if EmaCrossover() == (-1)
{
OrderClose( OrderTicket(), 1, Ask, 3, Red) &&
OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"",1337,0,Green);
}
}
}
//----
Comment("Order buy: ",OP_BUY,"\nOrder Sell: ",OP_SELL);
//----
return(0);
}
//+------------------------------------------------------------------+
EMA Crossover Signal prośba o kawałek kodu
Ja nie potrafię pisać kodu wywaliłem wszystko co dla mnie jest zbędne i tyle się zostało, poprawiłem to troszkę, teraz wchodzi mi kilkoma pozycjami na raz jak to zmienić, żeby wchodził raz?
Pozdrawiam
//---- input parameters
extern int iBarsAfterSignal=2;
extern int iStartTradingHour=1;
extern int iEndTradingHour=23;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
int i=0;
if(i < 1)
{
i++;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Ema Crossover |
//+------------------------------------------------------------------+
int EmaCrossover()
{
//Calculate the last 2 bars before now
int iLastSignals[];
double fasterEMAnow, fasterEMAprevious;
double slowerEMAnow, slowerEMAprevious;
fasterEMAnow = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 1);
fasterEMAprevious = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 2);
slowerEMAnow = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 1);
slowerEMAprevious = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 2);
if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious))
{
return (1);
}
if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious))
{
return (-1);
}
return (0);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
if (Hour() <= iStartTradingHour || Hour() >= iEndTradingHour) return;
//Check for Ema signal
if( EmaCrossover() == 0 ) return;
if (EmaCrossover() == 1)
{
OrderSend(Symbol(),OP_BUY,5,Ask,3,0,0,"",1337,0,Green);
}
if (EmaCrossover() == -1)
{
OrderSend(Symbol(),OP_SELL,5,Bid,3,0,0,"",1337,0,Red);
}
return;
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double fasterEMAnow = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 1);
double fasterEMAprevious = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 2);
double slowerEMAnow = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 1);
double slowerEMAprevious = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 2);
//---- check for history and trading
if (Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
{
if (fasterEMAnow > slowerEMAnow)
{
if (fasterEMAprevious < slowerEMAprevious)
{
OrderClose( OrderTicket(), 5, Ask, 3, Purple);
OrderSend(Symbol(),OP_BUY,5,Ask,3,0,0,"",1337,0,Yellow);
}
}
if (fasterEMAnow < slowerEMAnow)
{
if (fasterEMAprevious > slowerEMAprevious)
{
OrderClose( OrderTicket(), 5, Bid, 3, Black);
OrderSend(Symbol(),OP_SELL,5,Bid,3,0,0,"",1337,0,Orange);
}
}
}
//----
Comment("Order buy: ",OP_BUY,"\nOrder Sell: ",OP_SELL);
//----
return(0);
}
Pozdrawiam
//---- input parameters
extern int iBarsAfterSignal=2;
extern int iStartTradingHour=1;
extern int iEndTradingHour=23;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
int i=0;
if(i < 1)
{
i++;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Ema Crossover |
//+------------------------------------------------------------------+
int EmaCrossover()
{
//Calculate the last 2 bars before now
int iLastSignals[];
double fasterEMAnow, fasterEMAprevious;
double slowerEMAnow, slowerEMAprevious;
fasterEMAnow = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 1);
fasterEMAprevious = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 2);
slowerEMAnow = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 1);
slowerEMAprevious = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 2);
if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious))
{
return (1);
}
if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious))
{
return (-1);
}
return (0);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
if (Hour() <= iStartTradingHour || Hour() >= iEndTradingHour) return;
//Check for Ema signal
if( EmaCrossover() == 0 ) return;
if (EmaCrossover() == 1)
{
OrderSend(Symbol(),OP_BUY,5,Ask,3,0,0,"",1337,0,Green);
}
if (EmaCrossover() == -1)
{
OrderSend(Symbol(),OP_SELL,5,Bid,3,0,0,"",1337,0,Red);
}
return;
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double fasterEMAnow = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 1);
double fasterEMAprevious = iMA(NULL, 0, 4, 0, 0, PRICE_CLOSE, 2);
double slowerEMAnow = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 1);
double slowerEMAprevious = iMA(NULL, 0, 8, 0, 0, PRICE_CLOSE, 2);
//---- check for history and trading
if (Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
{
if (fasterEMAnow > slowerEMAnow)
{
if (fasterEMAprevious < slowerEMAprevious)
{
OrderClose( OrderTicket(), 5, Ask, 3, Purple);
OrderSend(Symbol(),OP_BUY,5,Ask,3,0,0,"",1337,0,Yellow);
}
}
if (fasterEMAnow < slowerEMAnow)
{
if (fasterEMAprevious > slowerEMAprevious)
{
OrderClose( OrderTicket(), 5, Bid, 3, Black);
OrderSend(Symbol(),OP_SELL,5,Bid,3,0,0,"",1337,0,Orange);
}
}
}
//----
Comment("Order buy: ",OP_BUY,"\nOrder Sell: ",OP_SELL);
//----
return(0);
}
Otwiera Ci się wiele pozycji, bo w dwóch miejscach masz kod odpowiedzialny za zawieranie transakcji.
Wywal wszystko co masz pod:
Przenieś zamykanie zleceń do funkcji
Warunki na otwieranie transakcji rozwijaj w
Jak będziesz otwierał pozycje w wielu miejscach w kodzie bardzo ciężko będzie nad tym zapanować.
(kodu nie sprawdzałem, pisałem "na oko")
Wywal wszystko co masz pod:
Kod: Zaznacz cały
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
Kod: Zaznacz cały
CheckForOpen()
Kod: Zaznacz cały
EmaCrossover()
(kodu nie sprawdzałem, pisałem "na oko")
Pozdrawiam
Piter
Piter
Ok zrobiłem tak i mam po jednym wejściu, tak jak chciałem, mam tylko jeszcze jeden problem tzn przy konsolidacji czyli w czasie delikatnego krosowania się wskaźników wchodzi mi nie potrzebnie (na wskaźniku EMA crossover signal tego nie ma - wyczekuje, aż wyjdzie z konsolidacji w jedną lub w drugą stronę.
Pozdrawiam
Edit Esco:
Dodałem znacznik CODE.
Pozdrawiam
Edit Esco:
Dodałem znacznik CODE.
Kod: Zaznacz cały
#define MAGICMA 20050610
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma1;
double ma2;
double ma3;
double ma4;
double ma5;
double ma6;
int res;
//---- get Moving Average
ma1=iMA(NULL,0,4,0,1,PRICE_CLOSE,1);
ma2=iMA(NULL,0,4,0,1,PRICE_CLOSE,2);
ma3=iMA(NULL,0,4,0,1,PRICE_CLOSE,0);
ma4=iMA(NULL,0,8,0,1,PRICE_CLOSE,1);
ma5=iMA(NULL,0,8,0,1,PRICE_CLOSE,2);
ma6=iMA(NULL,0,8,0,1,PRICE_CLOSE,0);
//---- sell conditions
if (ma1<ma4 && ma2>ma5 && ma3<ma6)
{
res=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
// }
//---- buy conditions
if(ma1>ma4 && ma2<ma5 && ma3>ma6)
{
res=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma1;
double ma2;
double ma3;
double ma4;
double ma5;
double ma6;
//---- get Moving Average
ma1=iMA(NULL,0,4,0,1,PRICE_CLOSE,1);
ma2=iMA(NULL,0,4,0,1,PRICE_CLOSE,2);
ma3=iMA(NULL,0,4,0,1,PRICE_CLOSE,0);
ma4=iMA(NULL,0,8,0,1,PRICE_CLOSE,1);
ma5=iMA(NULL,0,8,0,1,PRICE_CLOSE,2);
ma6=iMA(NULL,0,8,0,1,PRICE_CLOSE,0);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if (ma1<ma4 && ma2>ma5 && ma3<ma6) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(ma1>ma4 && ma2<ma5 && ma3>ma6)OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+----------------------------------