if (OP_SELL) if (OP_BUY)
Makes no sense, these are enums, not bools
OrderClose(OrderTicket(),0.1,Ask,5,clrNONE);
You have to select an order before you can use OrderTicket()
bool CloseMyBuyOrders() { bool ok=true; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==_Symbol && OrderMagic()==MagicID && OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,5,clrNONE)) { Print("order ",OrderTicket()," failed to close, error: ",GetLastError()); ok=false; } } } return ok; // true: ok, false: error }You might want to use this function to close your orders instead of if(OP_BUY)... which wouldn't work.
You might want to use this function to close your orders instead of if(OP_BUY)... which wouldn't work.
Thanks for your help! I think my problem stands with the whole code, because in my backtest it doesn't buy or sell at the reverse points and also it doesn't close the last order at the second place, which I think you tried to help me with the code provided. As I said I'm not good at programming and I also couldn't find a parabolic sar expert adviser that suits my needs or an easy code that I can change it to suit my needs. If you can help me with the whole code I would be very appreciated. I don't look for a very optional code, I just want a very basic Parabolic SAR function.
Again, thank you!
Do you really know, classical SAR has lots of missed opportunities?
Well, we can assist you in fixing the code but the job is on you. My idea to approach this is simple. 1) Build the signals, 2) Close open trades if opposite signal is set, 3) Open trade according to signal.
So we have something like this:
void OnTick() { // 1) Build signals double sar1 = iSAR(NULL, 0, 0.1, 0.2, 1); double sar2 = iSAR(NULL, 0, 0.1, 0.2, 0); bool buySignal = sar1>Open[1] && sar2<Open[0]; bool sellSignal = sar1<Open[1] && sar2>Open[0]; // 2) Close trades on opposite signal if (sellSignal) CloseMyBuyTrades(); if (buySignal) CloseMySellTrades(); // 3) Open trades on signal if (sellSignal && OrdersTotal()==0) OpenSellTrade(); if (buySignal && OrdersTotal()==0) OpenBuyTrade(); }
And that's it. You'll figure out the functions. Next would be to add trailing stop and what not but that's a different story.
Note there are situations where PSAR whipsaws badly.
Well, we can assist you in fixing the code but the job is on you. My idea to approach this is simple. 1) Build the signals, 2) Close open trades if opposite signal is set, 3) Open trade according to signal.
So we have something like this:
And that's it. You'll figure out the functions.
Next would be to add trailing stop and what not but that's a different story.
Thanks again! Well i started programming yesterday. i should've said that I'm not good at programming at all! :) i found a code on the internet that seems to work and edited it to make it basic as much as i could. but it doesn't work either. but there's no errors.
here's the code:
extern double LotSize=0.1; //Position size
extern int Slippage=5; //Slippage in pips
extern bool TradeEnabled=true; //Enable trade
extern double PSARStep=0.1; //PSAR Step
extern double PSARMaxStep=0.2; //PSAR Max Step
extern int MagicNumber=11223344; //Magic Number to assign to the orders
//Functional variables
double ePoint; //Point normalized
bool CanOrder; //Check for risk management
bool CanOpenBuy; //Flag if there are buy orders open
bool CanOpenSell; //Flag if there are sell orders open
int OrderOpRetry=10; //Number of attempts to perform a trade operation
int SleepSecs=1; //Seconds to sleep if can't order
int MinBars=60; //Minimum bars in the graph to enable trading
//Functional variables to determine prices
double MinSL;
double MaxSL;
double Spread;
int Slip;
//Variable initialization function
void Initialize(){
RefreshRates();
ePoint=Point;
Slip=Slippage;
if (MathMod(Digits,2)==1){
ePoint*=10;
Slip*=10;
}
CanOrder=TradeEnabled;
CanOpenBuy=true;
CanOpenSell=true;
}
//Check if orders can be submitted
void CheckCanOrder(){
if( Bars<MinBars ){
Print("INFO - Not enough Bars to trade");
CanOrder=false;
}
OrdersOpen();
return;
}
//Check if there are open orders and what type
void OrdersOpen(){
for( int i = 0 ; i < OrdersTotal() ; i++ ) {
if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) {
Print("ERROR - Unable to select the order - ",GetLastError());
break;
}
if( OrderSymbol()==Symbol() && OrderType() == OP_BUY) CanOpenBuy=false;
if( OrderSymbol()==Symbol() && OrderType() == OP_SELL) CanOpenSell=false;
}
return;
}
//Close all the orders of a specific type and current symbol
void CloseAll(int Command){
double ClosePrice=0;
for( int i = 0 ; i < OrdersTotal() ; i++ ) {
if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false ) {
Print("ERROR - Unable to select the order - ",GetLastError());
break;
}
if( OrderSymbol()==Symbol() && OrderType()==Command) {
if(Command==OP_BUY) ClosePrice=Bid;
if(Command==OP_SELL) ClosePrice=Ask;
double Lots=OrderLots();
int Ticket=OrderTicket();
for(int j=1; j<OrderOpRetry; j++){
bool res=OrderClose(OrderTicket(),LotSize,ClosePrice,Slippage,clrRed);
if(res){
Print("TRADE - CLOSE - Order ",Ticket," closed at price ",ClosePrice);
break;
}
else Print("ERROR - CLOSE - error closing order ",Ticket," return error: ",GetLastError());
}
}
}
return;
}
//Open new order of a given type
void OpenNew(int Command){
RefreshRates();
double OpenPrice=0;
double SLPrice;
double TPPrice;
if(Command==OP_BUY){
OpenPrice=Ask;
}
if(Command==OP_SELL){
OpenPrice=Bid;
}
for(int i=1; i<OrderOpRetry; i++){
int res=OrderSend(Symbol(),Command,LotSize,OpenPrice,Slippage,0,0,"",MagicNumber,0,Green);
if(res){
Print("TRADE - NEW - Order ",res," submitted: Command ",Command," Volume ",LotSize," Open ",OpenPrice," Slippage ",Slip," Stop ",SLPrice," Take ",TPPrice);
break;
}
else Print("ERROR - NEW - error sending order, return error: ",GetLastError());
}
return;
}
//Technical analysis of the indicators
bool CrossToOpenBuy=false;
bool CrossToOpenSell=false;
void CheckPSARCross(){
CrossToOpenBuy=false;
CrossToOpenSell=false;
double PSARCurr=iSAR(Symbol(),0,PSARStep,PSARMaxStep,0);
double PSARPrev=iSAR(Symbol(),0,PSARStep,PSARMaxStep,1);
if(PSARCurr<Close[0] && PSARPrev>Close[1]){
CrossToOpenBuy=true;
}
if(PSARCurr>Close[0] && PSARPrev<Close[1]){
CrossToOpenSell=true;
}
}
Can you see any problem?
- Please edit
your (original) post and use the CODE button
(Alt-S)! (For large amounts of code, attach it.)
General rules and best pratices of the Forum. - General - MQL5 programming forum
Messages Editor - Yes
- Please edit your (original) post and use the CODE
button (Alt-S)! (For large amounts of code, attach it.)
General rules and best pratices of the Forum. - General - MQL5 programming forum
Messages Editor - Yes
Hi. Thanks for your reply. I found this strategy useless. So I'll give up on it. But still thanks for your reply.
Could you please check my last topic here https://www.mql5.com/en/forum/319106? I recently built an strategy of my own, and i need to make an EA of it but i have a problem. Could you please help me?
- 2019.08.01
- www.mql5.com
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi. I want to build a Basic Parabolic SAR EA and after I write the code and start a backtest, it doesn't work the way it should, or better to say the way i want it to do.
Well i want to open a new trade at the reverse point and also close the last trade too.
here's my code:
Anybody can help me?
P.S. I'm not good at programming very much!