EA oparty na niestandardowym wskaźniku

O jezykach programowania w platformach i nie tylko.
ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

EA oparty na niestandardowym wskaźniku

Nieprzeczytany post autor: ebate »

Witam. Posiadam strategię opartą na wskaźniku, którą chciałbym "zrobotyzować". Problemem jest to ,że słabo znam język MQL 4. W dodatku wskaźnik, którego używam jest niestandardowy. Nie mam pojęcia jakich funkcji używać. Nie wiem jak przetłumaczyć na jezyk MQL4 założeń:

"Jeżeli wartości jest większa od 0 (przecina oś 0), to zamyka otwarte zlecenie sprzedaży równocześnie otwierając zlecenie kupna
Jeżeli wartość jest mniejsza od 0 (przecina oś 0), to zamyka otwarte zlecenie kupna równocześnie otwierając zlecenie sprzedaży."

Wskaźnik, którego używam nazywa się freescalpingindicators. Przy włączaniu wpisuje dwie wartości:
intensity (intensywność) : 18;
periods : 800.
Zdjęcie:
http://www.fotosik.pl/pokaz_obrazek/506 ... fc126.html

Najpewniej jest to kilka linijek kodu, co dla dobrego programisty to łatwizna, ale ja nie mam pojęcia od czego mam zacząć. Wiem, jak ciężko uczy się takich języków, gdyż uczyłem się PHP, więc nie wiem czy jest sens takowej nauki dla wspomnianych wyżej kilku linijek kodu.

Jeżeli napisanie tego programu (przetłumaczenie tych założeń) to zbyt dużo, to chociaż proszę o wskazówki.

Awatar użytkownika
profession
Pasjonat
Pasjonat
Posty: 503
Rejestracja: 19 mar 2008, 08:44

Nieprzeczytany post autor: profession »

Może umieść tutaj ten wskaźnik, wtedy ktoś będzie w stanie Ci pomóc. Tak to raczej ciężko.

p.s. Czy wskaźnik repaintuje?

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Nieprzeczytany post autor: ebate »

Wskaźnik jest niestety w ex4. Ale dodałem do wiadomości w rarze.
Co do repaintu: cóż, zmian wcześniejszych świec wskaźnika nie ma, a co do aktualnych... Raz tylko dostrzegłem zmiany . Niewielki słupek zółty zmienił kolor na niewielki słupek czerwony. Trochę na nim gram i tylko raz to zauważyłem. Wiec repaint jest, ale bardzo niewielki.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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

Nieprzeczytany post autor: personov »

Kod: Zaznacz cały

#include <stdlib.mqh>
int MagicNumber    = 888634;
extern double lot          = 1;
extern int    intensity    = 18;
extern int    periods      = 800;   
///////////////////////////////////////////////////////////////////////////////////////////////////
void init()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////
void deinit()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////
void start()
{  
   double it1 = iCustom(Symbol(),Period(),"freescalpingindicator",intensity,periods,0,0);
   double it2 = iCustom(Symbol(),Period(),"freescalpingindicator",intensity,periods,0,1);
   if(total(OP_BUY)==0&&it1>0&&it2<=0){send(OP_BUY);ZamknijSell();}
   if(total(OP_SELL)==0&&it1<0&&it2>=0){send(OP_SELL);ZamknijBuy();}  
}
///////////////////////////////////////////////////////////////////////////////////////////////////
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() && MagicNumber==OrderMagicNumber()) sum++;
   }
   return(sum);
}
///////////////////////////////////////////////////////
void send(int cmd)
{
   double Point_ = Point;
   if (Digits==3 || Digits==5) Point_=Point*10;
   double tp;
   double sl;
   double pr;
   color cl;
   if (cmd==OP_BUY)
   {
      pr = Ask;
      tp = 0;
      sl = 0;
      cl = Blue;
   }  
   if (cmd==OP_SELL)
   {
      pr = Bid;
      tp = 0;
      sl = 0;
      cl = Red;
   }  
   int ticket = OrderSend(Symbol(),cmd,lot,pr,0,sl,tp,"",MagicNumber,0,cl);
   if (ticket<=0) Print(ErrorDescription(GetLastError()));
}
/////////////////////////////////////////////////////////////////////////
void ZamknijBuy() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_BUY) 
  {OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);}}}} 

void ZamknijSell() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_SELL) 
  {OrderClose(OrderTicket(),OrderLots(),Ask,1,Black);}}}} 
Jednak czasem EA robi cuda, bo aktualny słupek moze być raz poniżej, a raz powyżej zera.
Przeanalizuj to sobie.
Solą życia jest kasa.

Awatar użytkownika
pan_martino
Gaduła
Gaduła
Posty: 181
Rejestracja: 01 kwie 2009, 13:51

Nieprzeczytany post autor: pan_martino »

potrzebna jeszcze pomoc? moge sie tym zajac w przyszlym tygodniu bo akurat mam napisana podobna strategie dla innego wskaznika.
Jak wyglada jego skutecznoosc. Da sie cos zarobic?

Awatar użytkownika
profession
Pasjonat
Pasjonat
Posty: 503
Rejestracja: 19 mar 2008, 08:44

Nieprzeczytany post autor: profession »

Sprawdzałem ten wskaźnik ręcznie. Otwierałem pozycję po zamknięciu świecy na której pojawiał się sygnał by uniknąć repaintu. Wyniki raczej marne. Może Wam uda się coś z tego wyciągnąć według mnie raczej słabo.
Austryjacka Szkoła Ekonomii jest sednem.

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Nieprzeczytany post autor: ebate »

To zależy na jakim okresie się gra. Ja gram na H1 i przy odpowiednim StopLoss'ie wyniki są całkiem niezłe.

A wracając do strategii. Tak jak personov powiedział, przy repaincie trochę szaleje, ale ogólnie jest to, co siedziało, o co mi chodziło.

Jeszcze mam pytanie. Jak wygląda sprawa ze StopLoss i/lub TrailingStop? Bardzo ciężko dodać w/w funkcje do tego kodu EA?

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

Nieprzeczytany post autor: personov »

Wersja z TP i SL :

Kod: Zaznacz cały

#include <stdlib.mqh> 
int MagicNumber    = 888634; 
extern double lot          = 1; 
extern int    TakeProfit = 20;
extern int    StopLoss  = 20;
extern int    intensity    = 18; 
extern int    periods      = 800;    
/////////////////////////////////////////////////////////////////////////////////////////////////// 
void init() 
{} 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
void deinit() 
{} 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
void start() 
{  
   double it1 = iCustom(Symbol(),Period(),"freescalpingindicator",intensity,periods,0,0); 
   double it2 = iCustom(Symbol(),Period(),"freescalpingindicator",intensity,periods,0,1); 
   if(total(OP_BUY)==0&&it1>0&&it2<=0){send(OP_BUY);ZamknijSell();} 
   if(total(OP_SELL)==0&&it1<0&&it2>=0){send(OP_SELL);ZamknijBuy();}  
} 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
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() && MagicNumber==OrderMagicNumber()) sum++; 
   } 
   return(sum); 
} 
/////////////////////////////////////////////////////// 
void send(int cmd) 
{ 
   double Point_ = Point; 
   if (Digits==3 || Digits==5) Point_=Point*10; 
   double tp; 
   double sl; 
   double pr; 
   color cl; 
   if (cmd==OP_BUY) 
   { 
      pr = Ask; 
      tp = Ask+TakeProfit*Point_; 
      sl = Ask-StopLoss*Point_; 
      cl = Blue; 
   }  
   if (cmd==OP_SELL) 
   { 
      pr = Bid; 
      tp = Bid-TakeProfit*Point_; 
      sl = Bid+StopLoss*Point_; 
      cl = Red; 
   }  
   int ticket = OrderSend(Symbol(),cmd,lot,pr,0,sl,tp,"",MagicNumber,0,cl); 
   if (ticket<=0) Print(ErrorDescription(GetLastError())); 
} 
///////////////////////////////////////////////////////////////////////// 
void ZamknijBuy() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_BUY) 
  {OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);}}}} 

void ZamknijSell() 
{int i; 
 for (i = 0; i < OrdersTotal(); i++) 
 {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_SELL) 
  {OrderClose(OrderTicket(),OrderLots(),Ask,1,Black);}}}}
Solą życia jest kasa.

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Nieprzeczytany post autor: ebate »

Orientuje się ktoś jak wmontować w podany powyżej EA funkcje Trailing Stop? Stop Loss mniej pasuje, a Trailing Stop przy odpowiedniej wartości moze pasować w sam raz.

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Nieprzeczytany post autor: ebate »

Znalazłem na forum osobny temat poświęcony TrailingStop'owi.
http://www.forex-nawigator.biz/dyskusje ... opy#122485
Nie wiem, który najlepiej pasuje, lecz dzisiaj starałem się wnieść do kodu EA kod TrailingStop'u zwykłego. Niestety, za każdym razem nie działał.
Mógłby ktoś doświadczony poświęcić mi chwilkę i dodać do kodu EA (tego najnowszego podanego przez personov'a) TrailingStop zwykły (podany w linku)?

ODPOWIEDZ