Pomoc MQL4

O jezykach programowania w platformach i nie tylko.
Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

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;
}

//+------------------------------------------------------------------+

WojtexWay
Gaduła
Gaduła
Posty: 145
Rejestracja: 18 wrz 2012, 19:22

Re: Pomoc MQL4

Nieprzeczytany post autor: WojtexWay »

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:

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;
			}
		}
	//...
	}

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

Dzięki za pomoc :D
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;
      }
   //...
   }

WojtexWay
Gaduła
Gaduła
Posty: 145
Rejestracja: 18 wrz 2012, 19:22

Re: Pomoc MQL4

Nieprzeczytany post autor: WojtexWay »

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?

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

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

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Pomoc MQL4

Nieprzeczytany post autor: personov »

A kompiluje się ?
Jak kompilujesz to jakie masz błędy ?
Solą życia jest kasa.

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

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ń.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Pomoc MQL4

Nieprzeczytany post autor: personov »

Zacznij od zamiany funkcji OnInit() na init()
i OnTick() na start()
Solą życia jest kasa.

Lucky1978
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 01 mar 2014, 21:57

Re: Pomoc MQL4

Nieprzeczytany post autor: Lucky1978 »

Dzięki zamieniłem i tester zaczął zawierać zlecenia :D 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:

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	
    
-- 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.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: Pomoc MQL4

Nieprzeczytany post autor: personov »

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.....
Solą życia jest kasa.

ODPOWIEDZ