Pomoc MQL4
Pomoc MQL4
Witam zaczynam przygodę z MQL4 i na starcie mam problem.
Mój pierwszy treningowy EA w założeniu bazuje na cenie BID czyli jak wartość ceny Bid wzrośnie o 20pipsów to składa zlecenie kupna (sl=20,tp=20) i analogicznie jak wartość ceny Bid zmaleje o 20 pipsów składa zlecenie sprzedaży sl=20,tp=20). Problem leży w tym fragmencie kodu : „wartBid=wartBid+(20*pips);wartBid=wartBid-(20*pips);” Nie wiem jak zrobić aby wartBid wzrastała o 20pipsów gdy otworzy zlecenie kupna i analogicznie malała o 20 pipsów gdy otworzy zlecenie sprzedaży.Tak aby po zamknięciu pozycji na stop loss EA otwierał zlecenie przeciwstawne do poprzedniego.
Za podpowiedź z góry dziękuje.
Mój kod:
//+------------------------------------------------------------------+
//| Przykład.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
double wartBid;
double pips;
extern int TakeProfit=20;
extern int StopLoss=20;
extern int MagicNumber=1234;
extern double LotSize=0.01;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{double ticksize = MarketInfo(Symbol(),MODE_TICKSIZE);
if (ticksize == 0.00001 || ticksize == 0.001)
pips = ticksize*10;
else pips= ticksize;
wartBid=Bid;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Bid>=wartBid+(20*pips))
{if (OrdersTotal()==0)
OrderSend(Symbol(),OP_BUY,LotSize,Ask,0,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green);
wartBid=wartBid+(20*pips);
}
if(Bid<=wartBid-(20*pips))
{ if (OrdersTotal()==0)
OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
wartBid=wartBid-(20*pips);
}
return;
}
//+------------------------------------------------------------------+
Mój pierwszy treningowy EA w założeniu bazuje na cenie BID czyli jak wartość ceny Bid wzrośnie o 20pipsów to składa zlecenie kupna (sl=20,tp=20) i analogicznie jak wartość ceny Bid zmaleje o 20 pipsów składa zlecenie sprzedaży sl=20,tp=20). Problem leży w tym fragmencie kodu : „wartBid=wartBid+(20*pips);wartBid=wartBid-(20*pips);” Nie wiem jak zrobić aby wartBid wzrastała o 20pipsów gdy otworzy zlecenie kupna i analogicznie malała o 20 pipsów gdy otworzy zlecenie sprzedaży.Tak aby po zamknięciu pozycji na stop loss EA otwierał zlecenie przeciwstawne do poprzedniego.
Za podpowiedź z góry dziękuje.
Mój kod:
//+------------------------------------------------------------------+
//| Przykład.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
double wartBid;
double pips;
extern int TakeProfit=20;
extern int StopLoss=20;
extern int MagicNumber=1234;
extern double LotSize=0.01;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{double ticksize = MarketInfo(Symbol(),MODE_TICKSIZE);
if (ticksize == 0.00001 || ticksize == 0.001)
pips = ticksize*10;
else pips= ticksize;
wartBid=Bid;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Bid>=wartBid+(20*pips))
{if (OrdersTotal()==0)
OrderSend(Symbol(),OP_BUY,LotSize,Ask,0,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green);
wartBid=wartBid+(20*pips);
}
if(Bid<=wartBid-(20*pips))
{ if (OrdersTotal()==0)
OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
wartBid=wartBid-(20*pips);
}
return;
}
//+------------------------------------------------------------------+
Re: Pomoc MQL4
Po pierwsze: używaj znaczników code!
Po drugie: rozumiem, że ma być otwarta tylko 1 pozycja?
Tak na szybko (bez głębszej analizy i testów) można to zrobić np. tak:
Po drugie: rozumiem, że ma być otwarta tylko 1 pozycja?
Tak na szybko (bez głębszej analizy i testów) można to zrobić np. tak:
Kod: Zaznacz cały
bool set_BID = false;
double wart_BID;
int co_ile_pipsow = 20;
//...
void onTick()
{
//...
if(!OrdersTotal())
{
if(set_BID)
{
if(BID > wart_BID+co_ile_pipsow*Point) //??? lub Twoje pips zamiast Point
{
OrderSend(...); //long
set_BID = false;
}
if(BID < wart_BID-co_ile_pipsow*Point) //??? lub Twoje pips zamiast Point
{
OrderSend(...); //short
set_BID = false;
}
}
else
{
set_BID = true;
wart_BID = BID;
}
}
//...
}
Re: Pomoc MQL4
Dzięki za pomoc
Jednak coś jeszcze jest nie tak bo w testerze strategii nie zawiera teraz żadnych zleceń.

Jednak coś jeszcze jest nie tak bo w testerze strategii nie zawiera teraz żadnych zleceń.
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| Przykład.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
bool set_BID = false;
double wart_BID;
int co_ile_pipsow = 20;
double pips;
extern int TakeProfit=20;
extern int StopLoss=20;
extern int MagicNumber=1234;
extern double LotSize=0.01;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{double ticksize = MarketInfo(Symbol(),MODE_TICKSIZE);
if (ticksize == 0.00001 || ticksize == 0.001)
pips = ticksize*10;
else pips= ticksize;
//---
return(INIT_SUCCEEDED);
}
//...
void onTick()
{
//...
if(!OrdersTotal())
{
if(set_BID)
{
if(Bid> wart_BID+co_ile_pipsow*pips) //??? lub Twoje pips zamiast Point
{
OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,0,0,Green);
set_BID = false;
}
if(Bid< wart_BID-co_ile_pipsow*pips) //??? lub Twoje pips zamiast Point
{
OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,Bid+(StopLoss*pips),Bid-(TakeProfit*pips),NULL,0,0,Red);
set_BID = false;
}
}
else
{
set_BID = true;
wart_BID = Bid;
}
return;
}
//...
}
Re: Pomoc MQL4
O_o
po pierwsze w dzienniku powinieneś mieć jakieś info co jest nie tak - np. czy wyskakują jakieś błędy etc. Jak nie działa to chociaż postaraj się znaleźć do którego momentu działa - postaraj się znaleźć, gdzie kod się wykonuje a gdzie już nie
pomocna może się okazać np. funkcja Comment() i/lub Print().
po drugie funkcja void ze swej natury niczego nie zwraca więc co tam robi return?
po trzecie czemu ten return jest wewnątrz if-a?
po czwarte czemu nie skorzystasz po prostu z Pointa?
po pierwsze w dzienniku powinieneś mieć jakieś info co jest nie tak - np. czy wyskakują jakieś błędy etc. Jak nie działa to chociaż postaraj się znaleźć do którego momentu działa - postaraj się znaleźć, gdzie kod się wykonuje a gdzie już nie

po drugie funkcja void ze swej natury niczego nie zwraca więc co tam robi return?
po trzecie czemu ten return jest wewnątrz if-a?
po czwarte czemu nie skorzystasz po prostu z Pointa?
Re: Pomoc MQL4
Jeśli chodzi o return to tak z rozpędu jakoś wskoczyło
A co do dziennika to owszem pokazuje 17 błędów ale nic z tego nie rozumiem. Na logikę kod powinien działać próbowałem z Printem ale niczego się nie dopatrzyłem.

Kod: Zaznacz cały
2014.03.02 19:37:14.348 EURJPY,M5: 1751502 tick events (6474 bars, 1752503 bar states) processed within 1326 ms (total time 2637 ms)
2014.03.02 19:37:13.018 SAFE + - inputs: TakeProfit=20; StopLoss=20; MagicNumber=1234; LotSize=0.01;
2014.03.02 19:37:13.001 TestGenerator: there are 17 generating errors
2014.03.02 19:37:12.144 TestGenerator: unmatched data error (volume limit 785 at 2014.02.06 16:35 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.142 TestGenerator: unmatched data error (volume limit 3136 at 2014.02.06 15:45 exceeded)
2014.03.02 19:37:12.141 TestGenerator: unmatched data error (volume limit 3179 at 2014.02.06 15:40 exceeded)
2014.03.02 19:37:12.140 TestGenerator: unmatched data error (volume limit 3331 at 2014.02.06 15:35 exceeded)
2014.03.02 19:37:12.139 TestGenerator: unmatched data error (volume limit 2887 at 2014.02.06 15:30 exceeded)
2014.03.02 19:37:12.135 TestGenerator: unmatched data error (volume limit 1992 at 2014.02.06 14:45 exceeded)
2014.03.02 19:37:12.129 TestGenerator: unmatched data error (volume limit 424 at 2014.02.06 12:25 exceeded)
2014.03.02 19:37:12.119 TestGenerator: unmatched data error (volume limit 427 at 2014.02.06 06:30 exceeded)
2014.03.02 19:37:11.888 TestGenerator: unmatched data error (volume limit 986 at 2014.02.03 12:40 exceeded)
2014.03.02 19:37:11.881 TestGenerator: unmatched data error (volume limit 792 at 2014.02.03 10:45 exceeded)
2014.03.02 19:37:11.881 TestGenerator: unmatched data error (volume limit 689 at 2014.02.03 10:35 exceeded)
2014.03.02 19:37:11.706 TestGenerator: current spread 44 used
2014.03.02 19:37:11.699 Expert SAFE + - EURJPY,M5: loaded successfully
2014.03.02 19:37:11.466 Expert SAFE + - EURJPY,M5: removed
Re: Pomoc MQL4
Jak się kompiluje to nie ma żadnych błędów i dla tego nie rozumiem co jest nie tak że w testerze nie zawiera zleceń.
Re: Pomoc MQL4
Zacznij od zamiany funkcji OnInit() na init()
i OnTick() na start()
i OnTick() na start()
Solą życia jest kasa.
Re: Pomoc MQL4
Dzięki zamieniłem i tester zaczął zawierać zlecenia
ale niestety błędnie. Tzn w założeniu gdy cena Bid zwiększy swoją wartość o 20 pipsów wchodzę w zlecenie kupna ze stop loss 20 i take profit 20.I analogicznie odwrotnie w zlecenie sprzedaży gdy cena zmniejszy swoją wartość. I teraz jak zlecenie zamknę na take profit to znów wchodzę w zlecenie kupna ponieważ cena wzrosła o kolejne 20 pipsów a jeżeli zlecenię zamknę na stop loss to wchodzę w zlecenie sprzedaży ponieważ cena spadła o 20 pipsów. I analogicznie postępuje ze zleceniem sprzedaży. Tester natomiast dał takie wyniki:
-- Dodano: 02 mar 2014, 21:40 --
Czyli w skrócie gdy zlecenie kupna zamykam na take profit to w tym momencie zawieram kolejną transakcje kupna a jak zamykam na stop loss to automatycznie zawieram transakcje sprzedaży. I odwrotnie w przypadku zlecenia sprzedaży take profit kolejne zlecenie sprzedaży stop loss zlecenie kupna.

Kod: Zaznacz cały
1 2014.02.27 02:20 sell 1 0.01 139.879 140.079 139.679
2 2014.02.27 02:41 s/l 1 0.01 140.079 140.079 139.679
3 2014.02.27 10:00 sell 2 0.01 139.835 140.035 139.635
4 2014.02.27 10:05 t/p 2 0.01 139.635 140.035 139.635
5 2014.02.27 11:20 sell 3 0.01 139.391 139.591 139.191
6 2014.02.27 11:44 t/p 3 0.01 139.191 139.591 139.191
7 2014.02.27 12:47 sell 4 0.01 138.946 139.146 138.746
8 2014.02.27 13:45 s/l 4 0.01 139.146 139.146 138.746 -
9 2014.02.27 15:36 buy 5 0.01 139.347 139.147 139.547
10 2014.02.27 15:56 t/p 5 0.01 139.547 139.147 139.547
11 2014.02.27 16:59 buy 6 0.01 139.791 139.591 139.991
12 2014.02.27 17:09 s/l 6 0.01 139.591 139.591 139.991
13 2014.02.27 18:07 buy 7 0.01 139.836 139.636 140.036
14 2014.02.27 18:15 t/p 7 0.01 140.036 139.636 140.036
Czyli w skrócie gdy zlecenie kupna zamykam na take profit to w tym momencie zawieram kolejną transakcje kupna a jak zamykam na stop loss to automatycznie zawieram transakcje sprzedaży. I odwrotnie w przypadku zlecenia sprzedaży take profit kolejne zlecenie sprzedaży stop loss zlecenie kupna.
Re: Pomoc MQL4
To daj sobie po spełnieniu warunków , że jak otwiera zlecenie buy to przy okazji wartBid=10000;, a jak otwiera sell to wartBid=0;
Wtedy po zamknięciu zlecenia nie otworzy Ci od razu następnego.
Idąc tym tokiem myślenia już jesteś o krok do przodu. Pomyśl co dalej.....
Wtedy po zamknięciu zlecenia nie otworzy Ci od razu następnego.
Idąc tym tokiem myślenia już jesteś o krok do przodu. Pomyśl co dalej.....
Solą życia jest kasa.