Uruchomienie Ea na wykresie Offline

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Uruchomienie Ea na wykresie Offline

Nieprzeczytany post autor: kris007 »

Kombinuję ale coś mi nie wychodzi :(

Chciałbym przerobić Ea aby dało się je uruchomić na stworzonym wykresie offline,
tworzone wykresy posiadają niestandardowe nazwy typu: EURUSD-1H,M3 lub EURUSD+5H,H4 ewentualnie EURUSD,M16
w zależności od preferencji i co się stworzy.

Jako przykładem moich kombinacji posłużę się standardowym kodem EA MACD Sample,
jakby ktoś mógł zerknąć co tam jest źle że to nie działa.

Założenie moje było takie aby zastąpić wszelkie:

Kod: Zaznacz cały

Symbol()
kodem:

Kod: Zaznacz cały

StringSubstr(Symbol(), 0, 6)
Przykład:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

/*-->*/  extern bool InnaNazwaSymbolu = True;  // True aby dzialal na dziwnych nazwach Offline

/*-->*/  string NazwaSymbolu;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars

/*-->*/  if(InnaNazwaSymbolu) NazwaSymbolu = StringSubstr(Symbol(), 0, 6);  
/*-->*/  else NazwaSymbolu = Symbol();

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
     
// to simplify the coding and speed up access
// data are put into internal variables

/*-->*/   MacdCurrent=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);     //NULL
/*-->*/   MacdPrevious=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);    
/*-->*/   SignalCurrent=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
/*-->*/   SignalPrevious=iMACD(NazwaSymbolu,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);       
/*-->*/   MaCurrent=iMA(NazwaSymbolu,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
/*-->*/   MaPrevious=iMA(NazwaSymbolu,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);        
   

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
/*-->*/  ticket=OrderSend(NazwaSymbolu,OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); //Symbol()
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
/*-->*/  ticket=OrderSend(NazwaSymbolu,OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //Symbol()
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
/*-->*/  OrderSymbol()==NazwaSymbolu)  // check for symbol   //Symbol()
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

kris007 pisze:StringSubstr(Symbol(), 0, 6)
A co jak nazwa symbolu jest "XXX/XXX"
? 7 znaków nie obsłużysz

Chyba nic nie trzeba przerabiać i samo

Kod: Zaznacz cały

Symbol() 
wystarcza
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

Tig3r pisze:A co jak nazwa symbolu jest "XXX/XXX"
? 7 znaków nie obsłużysz
tak oczywiście to też mam na uwadze, zastanawia mnie czy można wpisać więcej , na zapas np. 16, czy to w czymś przeszkadza?

Chyba nic nie trzeba przerabiać i samo Kod:
Symbol()

wystarcza
no właśnie nie wiem, ale ani tak ani tak nie działa.

Kiedyś Pierz Andrzej odpowiedział mi że trzeba przerobić, tylko wtedy odpuściłem temat, bo bardziej teoretycznie mnie to interesowało.

http://www.forex-nawigator.biz/dyskusje ... 569#438569
Ostatnio zmieniony 13 lip 2012, 13:54 przez kris007, łącznie zmieniany 1 raz.

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

Nieprzeczytany post autor: personov »

StringSubstr, czy StringSubStr ?

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

personov pisze:StringSubstr, czy StringSubStr ?
założyłem że StringSubstr, bo takiego StringSubStr nie ma, takiego StringSubString też.
Noo ale, jakbym wiedział to bym nie miał problemu :)

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Tig3r pisze:Chyba nic nie trzeba przerabiać i samo
no nie bardzo ;)

bo dla przykladu :
EURUSD-1H,M3
funkcja Symbol() zwroci Ci : EURUSD-1H

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

Pierz Andrzej pisze:funkcja Symbol() zwroci Ci : EURUSD-1H
a możesz powiedzieć co tam w tym przykładowym kodzie jest źle że to jeszcze nie działa?

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

kris007 jezeli mozesz to podeslij mi to EA ktorym tworzysz wykresy offline .. zobacze u siebie
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

Pierz Andrzej pisze:kris007 jezeli mozesz to podeslij mi to EA ktorym tworzysz wykresy offline .. zobacze u siebie
to jest indicator: P4L PeriodCon.mq4
Tu jest: http://www.forexfactory.com/showthread.php?t=206301

Jest o tyle ciekawy że oprócz tworzenia różnych TF daje możliwość przesunięcia godzinowego, czy nawet minutowego wykresu.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

wskaznik jest tak zbudowany ze nie odswieza wykresu ofline symulujac nadchodzacy tick . co powoduje ze funkcja start nie jest wykonywana .

wiec masz dwa wyjscia :

1
- w funkcji init na koncy wywolac funkcje start();
- a caly kod w funkcji start wziac w nieskonczona petle :

Kod: Zaznacz cały

string pair = "";
void init()
{
   pair = StringSubstr(Symbol(),0,6);
   Print("Symbol "+pair);
   start();
}
int start()
  {
   while(IsExpertEnabled() && !IsStopped())
   {
      RefreshRates();
      // tutaj caly kod ea
      Sleep(500);
   }
}
2
lub skorzystac z jakiejs biblioteki kodu ktory imituje nadchodzacy tick ;) gdybys byl zainteresowany taka biblioteka zapraszam na PW :)

ale z braku laku mozesz skorzystac spokojnie z pierwszej opcji

i kolejna sprawa to StringSubstr uzywaj tylko w tych funkcjach o ktorych wspomnialem OrderSend,OrderClose itp

w wskaznikach zostaw Symbol()

pozdrawiam
Andrzej Pierz

ODPOWIEDZ