Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Wiertara
Stały bywalec
Stały bywalec
Posty: 23
Rejestracja: 07 wrz 2007, 00:01

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Wiertara »

personov pisze:
Wiertara pisze:Jak z Candle_Body zrobić wartość zawsze dodatnią bo przy czarnych świecach wyświetla mi ujemną co jest zrozumiałe, więc jak to poprawić :-)
MathAbs() to wartość bezwzględna.

Kod: Zaznacz cały

double Candle_Body = MathAbs((CLOSE-OPEN)/10);
Dzięki:-)

Awatar użytkownika
micjat
Stały bywalec
Stały bywalec
Posty: 62
Rejestracja: 29 sty 2012, 20:58

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: micjat »

:?: :?: :?: :?: :?: :?: :?:
Chcę aby kod otwierał zlecenie SELL w momencie kiedy cena dotyka kropki (ParabolicSAR) i tylko warto zwrócić uwagę że momencie dotknięcia ta kropka przeskakuje spod ceny – nad cenę (wszystko dzieje się pod średnią kroczącą).
Zlecenie BUY analogicznie.

Na razie mam kod:
// Moving averages & Parabolic
double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0);
double Parabolic = iSAR(NULL,0,ParabolicStep,ParabolicMax,0);

// Buy order
if(Parabolic > FastMA && BuyTicket == 0)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);
// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;
bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
SellTicket = 0;
}
// Sell Order
if(Parabolic < FastMA && SellTicket == 0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;
Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
OpenPrice = Bid;
if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);
SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,UseSlippage,
SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
BuyTicket = 0;
}
return(0);
}

Czy ktoś mógłby podpowiedzieć mi jak to napisać w mql żeby było zgodnie z moimi założeniami?
:564:
Don't tell me the sky is the limit when there are footprints on the moon!

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

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: personov »

Ja bym wziął pod uwagę fakt, że w tym momencie, który chciałbyś uchwycić SAR przeskakuje z pod ceny nad cenę ( i odwrotnie ).
Taki moment uchwycisz tylko porównując SAR z poprzednim SARem.
Zdefiniuj sobie :

Kod: Zaznacz cały

double Parabolic = iSAR(NULL,0,ParabolicStep,ParabolicMax,0);
double Parabolic_a = iSAR(NULL,0,ParabolicStep,ParabolicMax,1);
I teraz w warunkach ujmij zapis :

Kod: Zaznacz cały

// Buy order
if(Parabolic_a>Bid && Parabolic<Bid && Parabolic > FastMA && BuyTicket == 0)
Solą życia jest kasa.

Awatar użytkownika
micjat
Stały bywalec
Stały bywalec
Posty: 62
Rejestracja: 29 sty 2012, 20:58

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: micjat »

Dzięki o to mi chodziło!

-- Dodano: ndz 08-09-2013, 11:39 --

:564: dla "personov" !!! Za jego pomoc przy kodzie mql.
Cóż mogę powiedzieć... o jego rzetelności i chęci pomocy powinni ballady śpiewać. Gdybym miał córkę to chciałbym żeby miała takiego adoratora jak on!
Pzdr
Don't tell me the sky is the limit when there are footprints on the moon!

daamiian
Stały bywalec
Stały bywalec
Posty: 26
Rejestracja: 31 gru 2009, 00:42

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: daamiian »

Co zmienić w kodzie, aby wskaźnik w testerze strategii wyglądał tak samo jak na wykresie live?
Chodzi mi o MTF_Stochastic.

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

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: personov »

daamiian pisze:Co zmienić w kodzie, aby wskaźnik w testerze strategii wyglądał tak samo jak na wykresie live?
Chodzi mi o MTF_Stochastic.
Powinien wyglądać tak samo. Chyba, że masz inne ustawienia tego wskaźnika w testerze strategii i inne na live.
Solą życia jest kasa.

daamiian
Stały bywalec
Stały bywalec
Posty: 26
Rejestracja: 31 gru 2009, 00:42

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: daamiian »

personov pisze:
daamiian pisze:Co zmienić w kodzie, aby wskaźnik w testerze strategii wyglądał tak samo jak na wykresie live?
Chodzi mi o MTF_Stochastic.
Powinien wyglądać tak samo. Chyba, że masz inne ustawienia tego wskaźnika w testerze strategii i inne na live.

Ustawienia mam takie same .

Chyba znalazłem rozwiązanie mojego problemu :
http://www.forexfactory.com/showthread.php?t=365258

Awatar użytkownika
micjat
Stały bywalec
Stały bywalec
Posty: 62
Rejestracja: 29 sty 2012, 20:58

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: micjat »

Mam następujący problem:
EA otwiera tylko jedną transakcję tzn:
- Mam sygnał do otwarcie pozycji - EA ją otwiera, automatycznie ustawia TP i SL (tak ma być) i pozycja jest otwarta do momentu jej zamkniecia przez SL lub TP i problemem jest to że w trakcie tego okresu czasu kiedy pozycja jest otwarta może pojawić się wiele sygnałów do zajęcia tekiej samej pozycji - a EA tego nie robi(chcę żeby mógł otwierać wiele pozycji ale tylko jedną na jeden sygnał). Jak to zmienić?

// Buy order
if(Parabolic_a>Bid && Parabolic<Bid && Parabolic > FastMA && BuyTicket == 0)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);
// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;
bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
SellTicket = 0;
}
// Sell Order
if(Parabolic_a<Ask && Parabolic>Ask && Parabolic < FastMA && SellTicket == 0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;
Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
OpenPrice = Bid;
if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);
SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,UseSlippage,
SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
BuyTicket = 0;
}
return(0);
}
Don't tell me the sky is the limit when there are footprints on the moon!

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

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: personov »

micjat pisze:Mam następujący problem:
EA otwiera tylko jedną transakcję tzn:
- Mam sygnał do otwarcie pozycji - EA ją otwiera, automatycznie ustawia TP i SL (tak ma być) i pozycja jest otwarta do momentu jej zamkniecia przez SL lub TP i problemem jest to że w trakcie tego okresu czasu kiedy pozycja jest otwarta może pojawić się wiele sygnałów do zajęcia tekiej samej pozycji - a EA tego nie robi(chcę żeby mógł otwierać wiele pozycji ale tylko jedną na jeden sygnał). Jak to zmienić?
Trzeba usunąć zapis

Kod: Zaznacz cały

BuyTicket == 0 
i

Kod: Zaznacz cały

SellTicket == 0
w warunku.
Te zapisy oznaczają, że jednocześnie może być otwarta tylko jedna pozycja Buy i jedna Sell.
Jednak jeśli usuniesz ten zapis to w momencie pojawienia się sygnału EA będzie Ci na jednym sygnale otwierało wiele transakcji ( bo warunki będą spełnione ).
Sposobem na to jest zastosowanie jakiejś blokady.
Najprostszym sposobem będzie zastosowanie zapisu w warunkach

Kod: Zaznacz cały

Volume[0]==1
Oznacza to, że pozycja będzie otwierana tylko na początku świecy.

-- Dodano: wt 10-09-2013, 12:08 --

Bardziej skomplikowanym sposobem, ale na pewno skuteczniejszym jest zastosowanie blokady, która będzie kasowana po kolejnej świecy. Na końcu kodu dochodzi funkcja, która definiuje początek świecy.
na początku kodu definicje :

Kod: Zaznacz cały

int blokBuy=0;
int blokSell=0;
Na początku funkcji start()

Kod: Zaznacz cały

//kasowanie blokady na następnej świecy
if((blokBuy==1||blokSell==1)&&isNewBar()){blokBuy=0;blokSell=0;}
W warunkach dopisujemy warunek, że blokada musi być na 0 i zaraz po otwieraniu zlecenia inicjacja blokady na 1 :

Kod: Zaznacz cały

// Buy order
if(blokBuy==0&&Parabolic_a>Bid && Parabolic<Bid && Parabolic > FastMA)
{
OrderSelect(SellTicket,SELECT_BY_TICKET);blokBuy=1;
// Close order
if(OrderCloseTime() == 0 && SellTicket > 0)
{
double CloseLots = OrderLots();
double ClosePrice = Ask;
bool Closed = OrderClose(SellTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
SellTicket = 0;
}
// Sell Order
if(blokSell==0&&Parabolic_a<Ask && Parabolic>Ask && Parabolic < FastMA)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);blokSell=1;
if(OrderCloseTime() == 0 && BuyTicket > 0)
{
CloseLots = OrderLots();
ClosePrice = Bid;
Closed = OrderClose(BuyTicket,CloseLots,ClosePrice,UseSlippage,Red);
}
OpenPrice = Bid;
if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);
SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,UseSlippage,
SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
BuyTicket = 0;
}
return(0);
}
I na końcu kodu poza funkcją start() funkcja rozpoznająca początek świecy :

Kod: Zaznacz cały

bool isNewBar() { 
 static int prevTime; 
 bool newBar=false; 
 if(Time[0]!=prevTime) { 
  newBar=true; 
  prevTime=Time[0];} 
  return(newBar);}
Solą życia jest kasa.

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: forexsowicz91 »

Napisałem wskaźnik "informacyjny", ale coś jest źle w kodzie bo nie wyświetla prawidłowo.
Screen 1 pokazuje jak wyświetla obecnie (czyli źle)
Screen 2 jak powinno być

Poniżej kod wskaźnika. Co jest źle?

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                   InfoMarket.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+


#property indicator_chart_window

extern color     kolor = White;
extern int       FontSize = 10;

extern string    Spreadtekst="Spread =";
extern string    Swaplongtekst="Swap long =";
extern string    Swapshorttekst="Swap short =";
extern string    Tickvaluetekst="Tick value =";


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   RefreshRates();
   
   int spreadmarket=MarketInfo(Symbol(),MODE_SPREAD);
   ObjectCreate("Spread",OBJ_LABEL,0,0,0);
   ObjectSetText("Spread",Spreadtekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Spread",OBJPROP_XDISTANCE,5);     
   ObjectSet("Spread",OBJPROP_YDISTANCE,20);
   ObjectCreate("spread",OBJ_LABEL,0,0,0);
   ObjectSetText("spread", spreadmarket,"Arial Black",kolor);
   ObjectSet("spread",OBJPROP_XDISTANCE,15);     
   ObjectSet("spread",OBJPROP_YDISTANCE,20);
   
   double swaplongmarket=MarketInfo(Symbol(),MODE_SWAPLONG);
   ObjectCreate("Swaplong",OBJ_LABEL,0,0,0); 
   ObjectSetText("Swaplong",Swaplongtekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Swaplong",OBJPROP_XDISTANCE,5);     
   ObjectSet("Swaplong",OBJPROP_YDISTANCE,30);
   ObjectCreate("swaplong",OBJ_LABEL,0,0,0);
   ObjectSetText("swaplong", swaplongmarket,"Arial Black",kolor);//swap dla pozycji long 
   ObjectSet("swaplong",OBJPROP_XDISTANCE,15);     
   ObjectSet("swaplong",OBJPROP_YDISTANCE,30);
   
   double swapshortmarket=MarketInfo(Symbol(),MODE_SWAPSHORT);
   ObjectCreate("Swapshort",OBJ_LABEL,0,0,0);  
   ObjectSetText("Swapshort",Swapshorttekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Swapshort",OBJPROP_XDISTANCE,5);     
   ObjectSet("Swapshort",OBJPROP_YDISTANCE,40);
   ObjectCreate("swapshort",OBJ_LABEL,0,0,0);
   ObjectSetText("swapshort", swapshortmarket,"Arial Black",kolor);//swap dla pozycji short
   ObjectSet("swapshort",OBJPROP_XDISTANCE,15);     
   ObjectSet("swapshort",OBJPROP_YDISTANCE,40);
   
   double tickvaluemarket=MarketInfo(Symbol(),MODE_TICKVALUE);
   ObjectCreate("Tickvalue",OBJ_LABEL,0,0,0);
   ObjectSetText("Tickvalue",Tickvaluetekst,FontSize ,"Arial Black",kolor);
   ObjectSet("Tickvalue",OBJPROP_XDISTANCE,5);     
   ObjectSet("Tickvalue",OBJPROP_YDISTANCE,60);
   ObjectCreate("tickvalue",OBJ_LABEL,0,0,0);
   ObjectSetText("tickvalue",tickvaluemarket, FontSize,"Arial Black",kolor);//wartość pipsa dla 1 lota
   ObjectSet("tickvalue",OBJPROP_XDISTANCE,15);     
   ObjectSet("tickvalue",OBJPROP_YDISTANCE,60);
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() 
   {

   ObjectDelete("Spread");
   ObjectDelete("spread");
   ObjectDelete("Swaplong");
   ObjectDelete("swaplong");
   ObjectDelete("Swapshort");
   ObjectDelete("swapshort");
   ObjectDelete("Tickvalue");
   ObjectDelete("tickvalue");
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  RefreshRates();
  
  ObjectSetText("spread",DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0));
  ObjectSetText("swaplong",DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2));
  ObjectSetText("swapshort",DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2));
  ObjectSetText("tickvalue",DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),2));
  
   return(0);
  }
//+------------------------------------------------------------------+
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

ODPOWIEDZ