Próbuję nauczyć się kodować doradców ekspertów, więc dostałem coś prostego na początek.
Chodzi o to, aby EA otworzyła długą pozycję, gdy cena przekroczy MA z dołu.
Następnie, gdy cena spadnie i przekroczy MA z góry, pozycja długa zostanie zamknięta, a krótka zostanie ot.
Pomysł wydaje się prosty, a poniższy kod wydaje się być właściwy, ale nic się nie dzieje.
Czy ktoś może wskazać mi, gdzie jest mój błąd?
extern double Lots = 0,01;
extern int Slippage = 7;
zewnętrzny ciąg komentarz = MA_Template;
extern int MagicNumber = 0;
/////////////////////////////////
int ThisBarTrade = 0;
int Position = 0;
int init () {
CalcPosition ();
}
int start () {
podwójne MA;
bool closed = false;
if (ThisBarTrade! = Bars) {
MA = iMA (NULL, 0,5,0,0,0,0);
//Kup warunek
if (MA gt; = Bid Bid;; 0) {
CalcPosition ();
if (Pozycja lt; 0) {
if (CloseSingleSell () == false) return (0);/błąd, ale może spróbować jeszcze raz
}
if (OpenSingleBuy () == false) return (0);/brak zakupu, ale może spróbować ponownie
ThisBarTrade = Bary;
}
//Warunek sprzedaży
if (MA lt;; = Ask Position gt; = 0) {
CalcPosition ();
if (pozycja gt; 0) {
if (CloseSingleBuy () == false) return (0);/błąd, ale może spróbować jeszcze raz
}
if (OpenSingleSell () == false) return (0);/brak sprzedaży, ale może spróbować ponownie
ThisBarTrade = Bary;
}
}
}
// ----------------------------------------------- -------------------
void CalcPosition () {
Pozycja = 0;
for (int i = 0; i lt; OrdersTotal (); i ) {
OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol () == Symbol ()) {
if (OrderType () == OP_BUY) Pozycja = 1;
if (OrderType () == OP_SELL) Pozycja - = 1;
}
}
}
bool CloseSingleBuy () {
bool zamknięty;
for (int i = 0; i lt; OrdersTotal (); i ) {
OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
if (Symbol () == OrderSymbol () MagicNumber == OrderMagicNumber ()) {
if (OrderType () == OP_BUY) {
while (! IsTradeAllowed ()) Sleep (MathRand ()10);
RefreshRates ();
closed = OrderClose (OrderTicket (), OrderLots (), Bid, Slippage, White);
Drukuj (próba zamknięcia pojedynczego zamówienia # i );
if (closed == -1) {
return (false);
} else {
return (true);
}
}
}
}
return (false);
}
bool CloseSingleSell () {
bool zamknięty;
for (int i = 0; i lt; OrdersTotal (); i ) {
OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
if (Symbol () == OrderSymbol () MagicNumber == OrderMagicNumber ()) {
if (OrderType () == OP_SELL) {
while (! IsTradeAllowed ()) Sleep (MathRand ()10);
RefreshRates ();
closed = OrderClose (OrderTicket (), OrderLots (), Ask, Slippage, White);
Drukuj (próba zamknięcia pojedynczego zamówienia zamówienia # i pytanie);
if (closed == -1) {
return (false);
} else {
return (true);
}
}
}
}
return (false);
}
bool OpenSingleBuy () {
if (Position! = 0) return (false);
int ticket = -1;
while (! IsTradeAllowed ()) Sleep (MathRand ()10);
RefreshRates ();
ticket = OrderSend (Symbol (), OP_BUY, Partie, Pytaj, Poślizg, 0.0, 0.0, komentarz kup, MagicNumber, 0, Lime);
if (ticket lt; 0) {
Drukuj (nie można otworzyć OpenSingleBuy, błąd #, GetLastError ());
return (false);
} else {
Drukuj (złożone zamówienie z OpenSingleBuy);
return (true);
}
return (false);
}
bool OpenSingleSell () {
if (Position! = 0) return (false);
int ticket = -1;
while (! IsTradeAllowed ()) Sleep (MathRand ()10);
RefreshRates ();
ticket = OrderSend (Symbol (), OP_SELL, Partie, Bid, Slippage, 0.0, 0.0, comment sell, MagicNumber, 0, Lime);
if (ticket lt; 0) {
Drukuj (niepowodzenie OpenSingleSell, błąd #, GetLastError ());
return (false);
} else {
Drukuj (Pomyślnie złożono zamówienie za pomocą OpenSingleSell);
return (true);
}
return (false);
}