Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
KeithFlint
Bywalec
Bywalec
Posty: 10
Rejestracja: 02 cze 2011, 15:30

Nieprzeczytany post autor: KeithFlint »

Jednak wreszcie sobie poradziłem.
Błąd był banalny - do zmiennej int RISK wpisywałem zmiennoprzecinkowe liczby.
thisredone miałeś racje z typami zmiennych, jednak na inną patrzyłem.

Oto jak wygląda poprawny kod:

Kod: Zaznacz cały

int              SL;
double      LotSize,  LotSizeX,  RISK

RISK=0.05;
SL=5;

LotSizeX=(RISK*AccountBalance())/(SL*10*iClose("USDPLN",1,0));
LotSize=NormalizeDouble(LotSizeX,2);
Takie proste, a ja tak kombinowałem...

Dziękuję wam bardzo za pomoc :)

Awatar użytkownika
sonixh
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 13 sty 2011, 19:26

Nieprzeczytany post autor: sonixh »

Jak to miło posłuchać jak mądry cos powie! :)
Obrazek

bialy
Stały bywalec
Stały bywalec
Posty: 54
Rejestracja: 16 maja 2011, 20:41

MarketInfo()

Nieprzeczytany post autor: bialy »

Kod: Zaznacz cały

Print(MarketInfo("USDPLN",MODE_TICKVALUE));
parametr MODE_TICKVALUE zawsze zwroci wartosc jednego pipsa dla jednego lota w walucie rachunku, czyli w przypadku par PLN na rachunku w PLN zawsze bedzie 1pips = 10PLN
jesli na EURUSD wywolasz
MarketInfo("EURUSD",MODE_TICKVALUE));
dostaniesz wartosc 1pipsa na EURUSD na 1locie czyli jesli chcesz policzyc tick_value dla microlota to mnozysz to przez 0.01 /to co chcesz liczyc to nie ma sensu bo broker ma te obliczenia w automacie /broker MM wali w chu.a ale w innych miejscach - tu jestes bezpieczny/ - przy micro to groszowe roznice/
jesli chcesz to liczyc sam to bedzie cos w tym stylu

Kod: Zaznacz cały

Print(MarketInfo(Symbol(),MODE_TICKVALUE)*0.01);
tak policzysz dla kazdej pary na ktorej uruchomisz skrypt
moze moja odpowiedz nie rozwiazuje Twoich watpliwosci ale pobaw sie
funkcja MarketInfo() - jak dla mnie malo zrozumiale opisana ale bardzo przydatna przy MoneyManagment
oszczedzajmy cykle procesora

Awatar użytkownika
gutek04
Gaduła
Gaduła
Posty: 346
Rejestracja: 26 sty 2009, 12:29

Nieprzeczytany post autor: gutek04 »

Możecie polecic jakieś książki dla początkującego programisty? Chodz mi o to że jestem kompletnie zielony w temacie, a mam pomysł na pewien wskaźnik i chciałbym go napisać...

Awatar użytkownika
sonixh
Stały bywalec
Stały bywalec
Posty: 57
Rejestracja: 13 sty 2011, 19:26

Nieprzeczytany post autor: sonixh »

https://rapidshare.com/files/648566226/ ... uage_4.doc

Nie wiem czy ten link zadziała bo przed chwilą to wrzuciłem .

Dodano po 1 minutach:

Sprawdziłem, działa. :)

Dodano po 8 godzinach 38 minutach:

Małe pytanko do Pierz Andrzej:
pomógłbyś mi z jeszcze jednym wskaźnikiem? mam wrażenie, że działa tylko połowa kodu i gdyby go ciut przerobić to mógłby być naprawdę użyteczny?
Obrazek

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

Nieprzeczytany post autor: Pierz Andrzej »

bialy pisze:parametr

Kod: Zaznacz cały

MODE_TICKVALUE
zawsze zwroci wartosc jednego pipsa dla jednego lota w walucie rachunku,
pozwole sobie Ciebie poprawic :)

Kod: Zaznacz cały

MODE_TICKVALUE
zwraca wartosc jednego lota dla jednego ticka a nie pipsa .....

o ile w walutach jeden tick jest rowny jednemu pipsowi o tyle w surowcach czy cfd juz tak prosto nie jest :)

np moze byc ze jeden pips (point) jest rowny 0.01 a tcik(skok) jest 0.05

sonixh pisze: Małe pytanko do Pierz Andrzej:
pomógłbyś mi z jeszcze jednym wskaźnikiem? mam wrażenie, że działa tylko połowa kodu i gdyby go ciut przerobić to mógłby być naprawdę użyteczny?

podeslij mi wszystko na : zlecenia@expert-advisor.pl

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

pitek9996
Uczestnik
Uczestnik
Posty: 2
Rejestracja: 06 lip 2011, 21:53

Nieprzeczytany post autor: pitek9996 »

witam wszystkich!!!
właśnie zaczynam przygodę z automatycznym tradingiem i mam problem. chciałbym wstawić do strategii funkcje stop loss ale za bardzo nie wiem jak to zrobić. jest to strategia MACD Sample na xtb.

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;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(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(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,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(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         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(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         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()==Symbol())  // check for 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.

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

pitek9996 pisze:witam wszystkich!!!
właśnie zaczynam przygodę z automatycznym tradingiem i mam problem. chciałbym wstawić do strategii funkcje stop loss ale za bardzo nie wiem jak to zrobić. jest to strategia MACD Sample na xtb.

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 double StopLoss = 20;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(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(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,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(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         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(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         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()==Symbol())  // check for 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.
Wystarczy zmienić funkcje.

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red); ( druga tylko dla Buy również (

i dodać

extern double StopLoss = 20;

Dodałem już do kodu u Ciebie, sprawdź czy działa.
fx-forum

pitek9996
Uczestnik
Uczestnik
Posty: 2
Rejestracja: 06 lip 2011, 21:53

Nieprzeczytany post autor: pitek9996 »

działa!!! wielkie dzięki

kru
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 09 kwie 2010, 08:57

Nieprzeczytany post autor: kru »

hej,

nie jestem pewien ale chyba znalazlem bug'a w mql5. czy ktos moglby to sprawdzic?

w debuggerze, w expression jak wpisuje nastepujace wyrazenie:

Kod: Zaznacz cały

-6.999999999999998+4
to w polu value mam

Kod: Zaznacz cały

-2.999999999999998
i to jest ok. ale nastepujace wyrazenia daja juz bardzo dziwne wyniki:

Kod: Zaznacz cały

expression:
-6.999999999999998+6
value:
-0.9999999999999982
oraz:

Kod: Zaznacz cały

-4.999999999999998+5
=
1.776356839400251e-015
SIC!!!

czy wiecie jak obejsc te bledy arytmetyczne? czy tez macie podobne wyniki?

z gory dzieki za odpowiedzi

ODPOWIEDZ