Napisałem EA, które otwiera pozycję, kiedy cena Bid/Ask oddala się od ceny otwarcia świecy m5 o określoną wartość.
Drugie kryterium wejścia to średnia krocząca M30, jeśli cena jest nad to kupujemy, pod średnią M30 sprzedajemy.
Następnie, po otwarciu konkretnej pozycji i osiągnięciu poziomu ceny określonego w kodzie, przesuwamy SL na BE.
Parametry dostosowane do NAS100 i do S&P500.
Oczywiście zastrzegam sobie, że EA powstało w celach edukacyjnych i w obecnym kształcie nie ma szans zarabiać.
Wrzucenie tego na konto REAL oznaczać może co najwyżej stratę. Nie wyzeruje konta od razu, ale będzie konsekwentnie pomniejszać depo. Jest to tylko część większego projektu:
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| DlugoscSwiec.mq4 |
//| MSTFKTR |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "MSTFKTR"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int SMA=30;
input int SL=1000;
input int TP=3000;
input ENUM_TIMEFRAMES PERIOD=PERIOD_M30;
input double Lot=0.1;
bool L=false;
bool S=false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if((OrdersTotal()>=1)&&(OrderType()==OP_BUY))
{
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
Print("wybrano pozycję nr",i);
double PoziomBE = OrderOpenPrice()+5;
Print("poziom BE to",PoziomBE);
if((Ask>OrderOpenPrice()+5))
{double NEW_SL=OrderOpenPrice()+2;
if(OrderModify(OrderTicket(),OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
{Print("przestawiono SL na poziom",NEW_SL);}
else Print("czekamy na poziom BE",GetLastError());
}
}
else
Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
}
}
if((OrdersTotal()>=1)&&(OrderType()==OP_SELL))
{
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
Print("wybrano pozycję nr",i);
double PoziomBE = OrderOpenPrice()-5;
Print("poziom BE to",PoziomBE);
if((Ask>OrderOpenPrice()-5))
{double NEW_SL=OrderOpenPrice()-2;
if(OrderModify(OrderTicket(),OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
{Print("przestawiono SL na poziom",NEW_SL);}
else Print("czekamy na poziom BE",GetLastError());
}
}
else
Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
}
}
if(OrdersTotal()<1){
L=false;S=false;
double aStopLoss = Ask - SL*_Point;
double bStopLoss = Bid + SL*_Point;
double aTakeProfit = Ask + TP*_Point;
double bTakeProfit = Bid - TP*_Point;
aStopLoss=NormalizeDouble(aStopLoss,_Digits);
bStopLoss=NormalizeDouble(bStopLoss,_Digits);
aTakeProfit=NormalizeDouble(aTakeProfit,_Digits);
bTakeProfit=NormalizeDouble(bTakeProfit,_Digits);
double SMA_M30 = iMA(NULL, PERIOD_M30, SMA, 0, 0, 0, 1);
Print("SMA=",SMA_M30);
if(Ask>SMA_M30){Print("dozwolone jest kupno");}
if(Bid<SMA_M30){Print("dozwolona jest sprzedaż");}
if((Ask>iOpen(NULL, PERIOD_M5, 0)+5)&&(Ask>SMA_M30)){L=true;S=false;}
else{L=false;S=false;}
if((Bid<iOpen(NULL, PERIOD_M5, 0)-5)&&(Bid<SMA_M30)){S=true;L=false;}
else{L=false;S=false;}
Print("S=",S," L=",L);
Print("Ask+1000=",Ask+10);
if(L){
if(OrderSend(NULL,OP_BUY,Lot,Ask,0,aStopLoss,aTakeProfit,NULL,0,0,clrNONE)<0)
Print("Zakup nieudany ",GetLastError());
else
Print("kupiono za",Ask);}
if(S){
if(OrderSend(NULL,OP_SELL,Lot,Bid,0,bStopLoss,bTakeProfit,NULL,0,0,clrNONE)<0)
Print("Sprzedaż nieudana ",GetLastError());
else
Print("sprzedano za",Bid);}
//---
}
//---
}
//+------------------------------------------------------------------+
Mam w związku powyższym taką kwestię:
Chciałbym badać bieżącą świecę i potrzebuję parametru iHighest oraz iLowest.
Czy można zbadać tę wartość dla świecy o indeksie 0, czy tylko 1?
Czyli, czy tą wartość dostanę dopiero po narysowaniu się świecy?
Próbowałem już iHighest w Sell, ale niestety nie zadziałało
Edit: Dobra, nie popatrzyłem jakie ma parametry iHighest. Napisane jest, że można zbadać indeks 0, także sam sobie odpowiadam na pytanie. Posta zostawiam wraz z kodem,