Proszę o pomoc - prosty kod

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
profession
Pasjonat
Pasjonat
Posty: 503
Rejestracja: 19 mar 2008, 08:44

Proszę o pomoc - prosty kod

Nieprzeczytany post autor: profession »

Witam :)

Mam Prośbę Panowie. Nie jestem za dobry w programowaniu(cały czas się uczę) i to co udało mi sie uzyskać jest poniżej ale brakuje kilku funkcji bo nie mogę coś rozgryźć ticketów oznaczających zlecenia.

Jeśli ktoś mógłby do tego coś dopisać były bym wdzięczny :)

Mianowice:
-Jeśli jest sygnał Buy lub Sell a jest już otwarte zlecenie niech otwiera kolejne po upływie x minut lub otwarciu nowej świecy (te warunki chyba będę umiał podmienić)
-dla każdego z otwartych zleceń tralling stop
-dla każdego ze zleceń zamknięcie jeśli "profit z pozycji" > X
-zamknięcie wszystkich zleceń o godzinie X

Nie mam pojęcia jak połączyć te aspekty z istniejącym kodem. Jeśli ktoś może pomóc to bardzo proszę :)

pozdrawiam

Kod: Zaznacz cały

//+------------------------------------------------------------------+ 
//|                                                 KolejnyGrall.mq4 | 
//|                                                       Profession | 
//|                                        http://www.metaquotes.net | 
//+------------------------------------------------------------------+ 
#property copyright "Profession" 
#property link      "http://www.xxx.pl"

//--- input parameters 
extern int       StopLoss=6; 
extern int       TakeProfit=12; 
extern double    Lots   = 0.1; 

int start() 
{ 
     if ( iRSI(NULL,0,5,PRICE_CLOSE,0)<30 && iRSI(NULL,0,5,PRICE_CLOSE,1)<iRSI(NULL,0,5,PRICE_CLOSE,0) && Hour()>=23  &&  Hour()<=24
          &&iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_MAIN,1)<iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_SIGNAL,1)&&(iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_MAIN,0)<70)) 
       { 
        if (countOrders(OP_BUY)==0)   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Bid+TakeProfit*Point,"My order BUY",16384,0,Green);  
       } 
       
       if ( iRSI(NULL,0,5,PRICE_CLOSE,0)>70 && iRSI(NULL,0,5,PRICE_CLOSE,1)>iRSI(NULL,0,5,PRICE_CLOSE,0) && Hour()>=23  &&  Hour()<=24
          &&iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_MAIN,1)<iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_SIGNAL,1)&&(iStochastic(NULL,0,14,4,4,MODE_SMA,1,MODE_MAIN,0)<30))
       { 
        if (countOrders(OP_SELL)==0)  OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"My order SELL",16384,0,Green); 
       } 
    
 return(0); 
}// end start 
int countOrders(int cmd) 
{ 
int count=0; 
for(int i=0;i<OrdersTotal();i++) 
               { 
               if(OrderSelect(i,SELECT_BY_POS)) 
               {              
                 if(OrderSymbol()==Symbol() && cmd==OrderType()) 
                 { 
                  count++; 
               } } }    
              return(count); 
} // end countOrders(int cmd)

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »


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

Nieprzeczytany post autor: profession »

Dzięki za link, ale właśnie nie potrafię tego połączyć w jedną całość gdy mam klika zleceń. Jak je Trallingować? Każde osobno? Po tickecie? czy jak?
Austryjacka Szkoła Ekonomii jest sednem.

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

podstawienie kodu z tamtego tematu bedize zarzadzalo wszystkimi zleceniami bez MagicNumber. Wiec jedyen co muszisz zrobic to dodac tam
mn albo zlikwidowac mn u siebie w kodzie.
uzyj ordersmagicnumber();

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

Re: Proszę o pomoc - prosty kod

Nieprzeczytany post autor: CoVal »

profession pisze:Witam :)

Mam Prośbę Panowie. Nie jestem za dobry w programowaniu(cały czas się uczę) i to co udało mi sie uzyskać jest poniżej ale brakuje kilku funkcji bo nie mogę coś rozgryźć ticketów oznaczających zlecenia.

Jeśli ktoś mógłby do tego coś dopisać były bym wdzięczny :)

Mianowice:
-Jeśli jest sygnał Buy lub Sell a jest już otwarte zlecenie niech otwiera kolejne po upływie x minut lub otwarciu nowej świecy (te warunki chyba będę umiał podmienić)
-dla każdego z otwartych zleceń tralling stop
-dla każdego ze zleceń zamknięcie jeśli "profit z pozycji" > X
-zamknięcie wszystkich zleceń o godzinie X

Nie mam pojęcia jak połączyć te aspekty z istniejącym kodem. Jeśli ktoś może pomóc to bardzo proszę :)

pozdrawiam
widzisz... sprobuj moze troche innego podejscia do tematu od strony techniczno-organizacyjnej :)

Kod, zapisany w taki sposob jak ty to zrobiles, jest nie tylko malo czytelny (co powoduje, ze Ty sam, pomimo iz jestes autorem gubisz sie w tym gaszczu warunkow) ale i trudny do rozbudowania.
Moze sprobuj myslec bardziej modulowo - tworz wlasne funkcje - to pozwoli ci nie tylko na zbudowanie jasnej i czytelnej funkcji start() ale i pozwoli ci o wiele latwiej rozbudowywac istniejacy kod czy nawet przenosic pewne gotowe moduly (funkcje) do innych nowych strategii.

Jestem pewien, ze dasz sobie rady napisac to SAM, jesli tylko podejdziesz do tego w odpowiedni sposob :)

Oczywiscie kazdy ma swoj styl kodowania pomyslow - ja zrobilbym to mniej wiecej tak:

Kod: Zaznacz cały

int start() 
{
 int ticket=0;
 if(endOfDay()==true) closeAllPositions();		// koniec dnia – zamykamy wszystko !!!
 closeOnProfit(setProfit);					// jesli mamy określony zysk to zamknij pozycje
 checkTrailings();						// jesli trzeba to przesun TS

 double rsi0 = iRSI(NULL,0,5,PRICE_CLOSE,0);
 double rsi1 = iRSI(NULL,0,5,PRICE_CLOSE,1);  // te wartosci sa obliczane lub przetwarzane w kilku miejscach, sa dlugie i zaciemniaja kod… dodatkowo – po co obliczac cos 2 lub wiecej razy, skoro 1 raz wystarczy…
// trading conditions for long
 if(tradingTime()==true    && 	// mamy odpowiedni czas do otwarcia pozycji
    tradingSignal(1)== 1    &&	// mamy sygnal do otwarcia longa (1=long, -1=short, 0=no sygnal)
    countOrders(OP_BUY)==0 &&		// nie ma otwartego w tej chwili zadnego longa
    newPositionEnabled()==true)	// czas od otwarcia ostatniego trade-u juz minal
   )
    ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Bid+TakeProfit*Point,"BUYING",16384,0,Green);
 if(ticket<1) reportError(1,log);	// log=zapisz do dziennika, alarm=wyswietl alarm, screen= tylko na ekranie
// trading conditions for short
 if(tradingTime()==true    && 	// mamy odpowiedni czas do otwarcia pozycji
    tradingSignal(-1)== -1 &&		// mamy sygnal do otwarcia shorta (1=long, -1=short, 0=no sygnal)
    countOrders(OP_SELL)==0 &&	// nie ma otwartego w tej chwili zadnego shorta
    newPositionEnabled()==true)	// czas od otwarcia ostatniego trade-u juz minal
   )
    ticket= OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Ask-TakeProfit*Point,"SELLING",16384,0,Red); 
 if(ticket<1) reportError(-1,log);	// log=zapisz do dziennika, alarm=wyswietl alarm, screen= tylko na ekranie
}   


 
Bool endOfDay()
     {
      if(Hour()==clHour &&
         Minute()==clMinute)
         return(true);
      else
         return(false);
     }
void closeAllPosition()
     {
      double closePrice=0;
      if(OrdersTotal()==0) return; // nie ma co zamykac
      
      while(OrdersTotal>0)
           {
            OrderSelect(0,SELECT_BY_POS);
            if(OrderType()==OP_BUY) closePrice=Bid;
            else closePrice=Ask;
            OrderClose(OrderTicket(),OrderLots(),closePrice,2,Orange);
           }
      return;
     }
reszte funkcji wpisz sobie sam i potem w miare potrzeb rozbudowywuj tego swojego grala do chwili, az z nazwy: kolejny "graal zrobi" sie: "graal ostateczny".

Dla mnie - w funkcji start() powinny byc tylko podstawowe zalozenia systemu ujete w prosty algorytm. Wszystkie szczegolowe warunki i dzialanie wynikajace z nich powinny byc w zewnetrznych funkcjach.

acha - i rob sobie opisy.... nie tylko dla celow edycji kodu teraz, ale jesli wrocisz do tego kodu za miesiac, czy rok, to o wiele szybciej dojdziesz do tego co ten system czy wskaznik wlasciwie robic powinien).

UWAGA
w kodzie moga byc rozne bledy skladniowe, czy zwykle glupoty (e&o), za ktore przepraszam - pisze bowiem z glowy (mam nudna telekonferencje), bez mozliwosci sprawdzenia tego w MetaEdytorze...

pzdr,

CoVal

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

Nieprzeczytany post autor: profession »

Dzięki wielkie za odpowiedź, bardzo wiele mi to wyjaśniło. Dzięki za kod CoVal :)
Austryjacka Szkoła Ekonomii jest sednem.

ODPOWIEDZ