Pojedyncza transakcja i zamknięcie z MA

O jezykach programowania w platformach i nie tylko.
maniek16
Bywalec
Bywalec
Posty: 12
Rejestracja: 28 mar 2012, 20:13

Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: maniek16 »

Witam!
Od niedawna programuję i mam problem z moim robotem. Proszę o pomoc.
Pytanie 1: jaki napisać kod aby EA stawiał pojedyncze transakcje (do momentu zamknięcia pierwszej transakcji nie otwierał drugiej)?
Pytanie 2: jaki jest kod aby transakcja została zamknięta w momencie zmiany kierunku średniej kroczącej


Dorzucam robota, na razie wygląda tak:

//+------------------------------------------------------------------+
//| MA. mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "MA"
#property link "http://www.maniek.pl"//

//--- input parameters

extern int StopLoss=40;
extern int TakeProfit=80;
extern double Lots =0.1;
extern double DecreaseFactor=0;
extern double MovingPeriod=55;
extern double MovingShift=0;

int Krótka=0;

int start()
{

{

double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

if(ma0<ma1)

{
OrderSend(Symbol(),OP_SELL,Lots,Ask,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"My order SELL",16384,0,Green);
}

}

return(0);
}
Kilka moich spostrzeżeń na temat Forex http://forex-u-mariana.blogspot.com/

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

Re: Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: personov »

Pomocna Ci będzie funkcja zliczająca liczbę otwartych transakcji. Np. :

Kod: Zaznacz cały

int total(int cmd)
{int sum=0;
 for(int i=0;i<=OrdersTotal();i++)
 {OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol()==Symbol()&&cmd==OrderType()&&OrderMagicNumber()==16384) sum++;
 }return(sum);} 
Funkcję dodajesz na końcu kodu poza funkcją start().
I w warunku otwierania transakcji dodajesz

Kod: Zaznacz cały

if(total(OP_BUY)==0&&......)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"My order BUY",16384,0,Green); 
Wiadomo, że w warunku masz jeśli ilość buy =0, jak otworzy jedno buy to juz drugiego nie otworzy.
Pamiętaj, że zlecene BUY otwierasz po cenie Ask , a SELL po cenie Bid. Widzę, że teraz masz błąd.
Zmianę kierunku określasz porównując MA aktualne z MA poprzednim, więc poprzednia MA ma shift 1.
Czyli jeśli ma0>ma1 i dajesz OrderClose().
Pamiętaj również, że MA liczona po cenie Close zmienia swoją wartość do momentu zamknięcia świecy, czyli takich zmian kierunku możesz mieć 100 na minutę.
Solą życia jest kasa.

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Re: Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: CoVal »

maniek16 pisze:Witam!
Od niedawna programuję i mam problem z moim robotem. Proszę o pomoc.
Pytanie 1: jaki napisać kod aby EA stawiał pojedyncze transakcje (do momentu zamknięcia pierwszej transakcji nie otwierał drugiej)?
Pytanie 2: jaki jest kod aby transakcja została zamknięta w momencie zmiany kierunku średniej kroczącej
ad 1.

jesli chcesz miec tylko 1 pozycje otwarta, to po prostu sprawdzasz wartosc jaka zwraca ci funkcja: OrdersTotal(), czyli
w swoim warunku otwarcia pozycji napisz:

Kod: Zaznacz cały

if(ma0<ma1 && OrdersTotal()<1)
  { 
   OrderSend(Symbol(),OP_SELL,Lots,Ask,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"My order SELL",16384,0,Green); 
  }
Kod funkcji ktory podal Ci Personov jest ok, ale zlicza ilosc otwartych pozycji jednego typu i to dodatkowo o ustalonym stalym MagicNumber, a nie wszystkie - ty jak rozumiem chcesz miec tylko 1 pozycje otwarta.

Co do drugiego warunku, to zdefiniuj najpierw slowami co rozumiesz przez:
"zmiane kierunku sredniej kroczacej"
- jesli oznacza to, ze (przyjmujac iz srednia kroczy w gore) wartosc sredniej na biezacej swiecy bedzie nizsza niz na swiecy poprzedniej, to mozesz napisac takie cos jak masz - ale to moze byc tylko chwilowa zmiana (pisal o tym tez Personov) w czasie 1 swiecy, a w sekunde pozniej juz mozesz miec ma0=ma1 lub nawet ma0>ma1.
Moze wiec warto dodac jeszcze jakis inny warunek sprawdzajacy.

No i nie zapomnij dorobic tez czesci otwierajacej pozycje dlugie.... :)

maniek16
Bywalec
Bywalec
Posty: 12
Rejestracja: 28 mar 2012, 20:13

Re: Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: maniek16 »

Tak, otwartą tylko jedną pozycję.

Kod poniżej działa, dzięki:)

//+------------------------------------------------------------------+
//| MA H1 .mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "MA H1"
#property link "http://www.maniek.pl"//

//--- input parameters

extern int StopLoss=40;
extern int TakeProfit=60;
extern double Lots =0.1;
extern double DecreaseFactor=0;
extern double MovingPeriod=55;
extern double MovingShift=0;

int Krótka=0;

int start()
{

{

double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

if(ma0<ma1 && OrdersTotal()<1)

{
OrderSend(Symbol(),OP_SELL,Lots,Ask,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"My order SELL",16384,0,Green);
}


}

return(0);
}

A zamykanie pozycji to chodzi mi zmianę kierunku już po zamknięciu świecy...?
Będę wdzięczny za taki "ruchomy take profit":)
Kilka moich spostrzeżeń na temat Forex http://forex-u-mariana.blogspot.com/

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

Re: Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: personov »

Jak chcesz po zamknięciu świecy to porównuj MA z shift 1 i MA z shift 2, a nie 0 i 1.
I zmień otwieranie tego sella na Bid, bo masz cały czas Ask ( czwarta wartość w nawiasie OrderSend ).
Solą życia jest kasa.

maniek16
Bywalec
Bywalec
Posty: 12
Rejestracja: 28 mar 2012, 20:13

Re: Pojedyncza transakcja i zamknięcie z MA

Nieprzeczytany post autor: maniek16 »

Ale shift to wartość na końcu nawiasu?

double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

Czy MovingShift?

extern double MovingShift=1;

i nie mam pojęcia jak wygląda OrderClose...? Szukam na forum i nie moge znaleźć..

-- Dodano: wt 02-10-2012, 19:29 --

//+------------------------------------------------------------------+
//| MA.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "MA"
#property link "http://www.maniek.pl"//

//--- input parameters

extern int StopLoss=40;
extern int TakeProfit=400;
extern double Lots =0.1;
extern double DecreaseFactor=0;
extern double MovingPeriod=55;
extern double MovingShift=0;

int Krótka=0;

int start()
{

{

double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);
double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);

if(ma0<ma1 && OrdersTotal()<1)


{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"My order SELL",16384,0,Green);
}

if(ma0>ma1)

{
OrderClose(Ask,Orange);
return(0);
}

}

return(0);
}

Co jeszcze dorzucić do nawiasu order close? proszę o pomoc.
Kilka moich spostrzeżeń na temat Forex http://forex-u-mariana.blogspot.com/

ODPOWIEDZ