For coder ,how to make this ea work on ECN mt4

 

/+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double llots;
double lSL;

if (TakeProfit==0) TakeProfit=StopLoss/2;

if (StopDistance!=TakeProfit)
if (StopDistance!=(TakeProfit/2))
return (-1);
if (TimeFrame!=0)
if ((TimeFrame!=PERIOD_M1) && (TimeFrame!=PERIOD_M5) && (TimeFrame!=PERIOD_M15) && (TimeFrame!=PERIOD_M30) && (TimeFrame!=PERIOD_H1) && (TimeFrame!=PERIOD_H4) && (TimeFrame!=PERIOD_D1) && (TimeFrame!=PERIOD_W1) && (TimeFrame!=PERIOD_MN1))
return (-1);

if(MaxLots==0) llots=LotSize(); else
if(MaxLots==LotSize()) llots=3*LotSize(); else
llots=MaxLots*2;

lSL=StopLoss;

CheckSignal();


if(cur_signal & _BUY !=0)
OpenOrder(OP_BUY, llots, Ask, Slippage, lSL, TakeProfit, WindowExpertName(), MagicNumber, 0, Blue);

if(cur_signal & _SELL !=0)
OpenOrder(OP_SELL, llots, Bid, Slippage, lSL, TakeProfit, WindowExpertName(), MagicNumber, 0, Red);

if(cur_signal & _CLOSEBUY !=0)
{
CloseLongs(MagicNumber);
}

if(cur_signal & _CLOSESELL !=0)
{
CloseShorts(MagicNumber);
}

if(cur_signal & _DELETEBUYSTOP !=0)
DeleteOpenOrder(OP_BUYSTOP);

if(cur_signal & _DELETESELLSTOP !=0)
DeleteOpenOrder(OP_SELLSTOP);

if(cur_signal & _OPENBUYSTOP !=0)
{
DeleteOpenOrder(OP_BUYSTOP);
if(FirstOrderIsLong) BuyStopPrice=EntryPrice; else BuyStopPrice=EntryPrice+StopDistance*point;
Print ("First Order Is Long = " + FirstOrderIsLong);
OpenOrder(OP_BUYSTOP, llots, BuyStopPrice, Slippage, lSL, TakeProfit, WindowExpertName(), MagicNumber, 0, Blue);
}

if(cur_signal & _OPENSELLSTOP !=0)
{
DeleteOpenOrder(OP_SELLSTOP);
Print ("Entry Price = " + NormalizeDouble(EntryPrice,Digits));
if(FirstOrderIsLong) SellStopPrice=EntryPrice-StopDistance*point; else SellStopPrice=EntryPrice;
Print ("First Order Is Long = " + FirstOrderIsLong);
OpenOrder(OP_SELLSTOP, llots, SellStopPrice, Slippage, lSL, TakeProfit, WindowExpertName(), MagicNumber, 0, Red);
}

CheckOpenPositions();
HandleOpenPositions();
return(0);
}
//+------------------------------------------------------------------+


void CheckSignal()
{
cur_signal=_NONE;

if(OpenBuy==0 && OpenSell==0)
{
if(OpenBuyStop>0) cur_signal |= _DELETEBUYSTOP;
if(OpenSellStop>0) cur_signal |= _DELETESELLSTOP;

if(cur_signal==_NONE)
{
// to see if it's possible to made a trade
if(BlockTradingFilter1())
return(0);

MA=iMA(NULL,TimeFrame,Period_MA,0,MODE_SMA,PRICE_CLOSE,0);

if (Bid > MA && Fact_Up == true) // Checking if price above
{
Fact_Dn = true; // Report about price above MA
Fact_Up = false; // Don't report about price below MA
//Alert("Price is above MA(",Period_MA,")."); // Alert
FirstOrderIsLong = true;
}
//--------------------------------------------------------------------
if (Bid < MA && Fact_Dn == true) // Checking if price below
{
Fact_Up = true; // Report about price below MA
Fact_Dn = false; // Don't report about price above MA
//Alert("Price is below MA(",Period_MA,").");// Alert
FirstOrderIsLong = false;
}


if(FirstOrderIsLong) cur_signal |= _BUY; else cur_signal |= _SELL;
EntryPrice=0;
}
}

if(OpenBuy!=0 || OpenSell!=0)
{
if(OpenBuy>OpenSell && OpenSellStop==0)
{
cur_signal |= _OPENSELLSTOP;
}
if(OpenBuy<OpenSell && OpenBuyStop==0)
{
cur_signal |= _OPENBUYSTOP;
}
}
}

//+------------------------------------------------------------------+
//| FILTER BLOCK MODULES
//+------------------------------------------------------------------+
bool BlockTradingFilter1()
{ //Original code Contributed by Wackena
bool BlockTrade=false; //trade by default
if (UseHourTrade)
{
if( !(Hour() >= StartHourTrade && Hour() <= EndHourTrade && Minute()<= 3) )
{
// Comment("Non-Trading Hours!");
BlockTrade=true;
}
}
return (BlockTrade);
}

//+------------------------------------------------------------------+
//| Handle Open Positions |
//| Check if any open positions need to be closed or modified |
//+------------------------------------------------------------------+
int HandleOpenPositions()
{
int cnt;
bool YesClose;
double pt;

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
if ( OrderSymbol() != Symbol()) continue;
if ( OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == OP_BUY)
{
}

if(OrderType() == OP_SELL)
{
}
}
return(0);
}


int OpenOrder(int aCmd, double aLots, double aPrice, int aSlipPage, int aStopLoss, int aTakeProfit, string aComment, int aMagic, datetime aExpiration, color aColor)
{
int order_ticket = 0;
int err = 0;
int l_Try = 0;
int l_MaxTry = 10;
double aPrice2=aPrice;// +Ask-Bid;
double maxLots = MarketInfo(Symbol(),MODE_MAXLOT);
double StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

switch (aCmd) {
case OP_BUY:
case OP_BUYLIMIT:
case OP_BUYSTOP:
for (l_Try = 0; l_Try < l_MaxTry; l_Try++)
{
aPrice2=aPrice;
if(aCmd==OP_BUY) { RefreshRates(); aPrice=Ask; /*aPrice2=Bid;*/ }
if (aLots<=maxLots)
order_ticket = OrderSend(Symbol(), aCmd, aLots, aPrice, aSlipPage, StopLong(aPrice, aStopLoss), TakeLong(aPrice, aTakeProfit), aComment, aMagic, aExpiration, aColor);
else{
while (aLots>0){
double bLots = 0;
string bLotComment = DoubleToStr( aLots,2);
if (aLots>maxLots)
{
aLots = aLots - maxLots;
bLots = maxLots;
}
else{
bLots = aLots;
aLots = 0;
}
order_ticket = OrderSend(Symbol(), aCmd, bLots, aPrice, aSlipPage, StopLong(aPrice, aStopLoss), TakeLong(aPrice, aTakeProfit), bLotComment, aMagic, aExpiration, aColor);
}
}
if (order_ticket > 0) break;
err = GetLastError();
if (err == 0) break;
if (err == 4 || err == 137 || err == 146 || err == 136) Sleep(5000);
else {
if (aCmd == OP_BUY)
Print ("Buy");
else if (aCmd == OP_BUYSTOP)
Print ("Buy Stop");
else
Print ("Buy Limit");
Print("Buy Error Code= ", err, "Lots = " + DoubleToStr(MathMax(bLots,aLots),2), "SL = " + DoubleToStr(StopLong(aPrice,aStopLoss),Digits), "TP = " + DoubleToStr(TakeLong(aPrice,TakeProfit),Digits), " When Price = " + DoubleToStr(aPrice,Digits), " StopLevel = " + DoubleToStr(StopLevel,2), " Bid = " + DoubleToStr(Bid,Digits), " Ask = " + DoubleToStr(Ask,Digits), " AB = " + DoubleToStr(AccountBalance(),2), " AE = " + DoubleToStr(AccountEquity(),2), " EP = " + DoubleToStr(EntryPrice,Digits));
break;
}
}
break;
case OP_SELL:
case OP_SELLLIMIT:
case OP_SELLSTOP:
for (l_Try = 0; l_Try < l_MaxTry; l_Try++) {
aPrice2=aPrice;
if(aCmd==OP_SELL) { RefreshRates(); aPrice=Bid; aPrice2=Ask; }
if (aLots<=maxLots)
order_ticket = OrderSend(Symbol(), aCmd, aLots, aPrice, aSlipPage, StopShort(aPrice, aStopLoss), TakeShort(aPrice, aTakeProfit), aComment, aMagic, aExpiration, aColor);
else{
double sLots = 0;
string slotComment = DoubleToStr( aLots,2);
if (aLots>maxLots)
{
aLots = aLots - maxLots;
sLots = maxLots;
}
else{
sLots = aLots;
aLots = 0;
}
order_ticket = OrderSend(Symbol(), aCmd, sLots, aPrice, aSlipPage, StopShort(aPrice, aStopLoss), TakeShort(aPrice, aTakeProfit), slotComment, aMagic, aExpiration, aColor);
}
if (order_ticket > 0) break;
err = GetLastError();
if (err == 0) break;
if (err == 4 || err == 137 || err == 146 || err == 136) Sleep(5000);
else {
if (aCmd == OP_SELL)
Print ("Sell");
else if (aCmd == OP_SELLSTOP)
Print ("Sell Stop");
else
Print ("Sell Limit");
Print("Sell Error Code= ", err, "Lots = " + DoubleToStr(MathMax(sLots,aLots),2), "SL = " + DoubleToStr(StopShort(aPrice,aStopLoss),Digits), "TP = " + DoubleToStr(TakeShort(aPrice,TakeProfit),Digits), " When Price = " + DoubleToStr(aPrice,Digits), " StopLevel = " + DoubleToStr(StopLevel,2), " Bid = " + DoubleToStr(Bid,Digits), " Ask = " + DoubleToStr(Ask,Digits), " AB = " + DoubleToStr(AccountBalance(),2), " AE = " + DoubleToStr(AccountEquity(),2), " EP = " + DoubleToStr(EntryPrice,Digits));
break;
}
}
}
CheckStops(order_ticket);
return (order_ticket);
}

double StopLong(double aPrice, int aPips) {
if (aPips == 0) return (0);
else return (NormalizeDouble(aPrice - aPips * point,Digits));
}

double StopShort(double aPrice, int aPips) {
if (aPips == 0) return (0);
else return (NormalizeDouble(aPrice + aPips * point,Digits));
}

double TakeLong(double aPrice, int aPips) {
if (aPips == 0) return (0);
else return (NormalizeDouble(aPrice + aPips * point,Digits));
}

double TakeShort(double aPrice, int aPips) {
if (aPips == 0) return (0);
else return (NormalizeDouble(aPrice - aPips * point,Digits));
}

double CheckOpenPositions(bool InclOpenOrder=true)
{
int cnt, total;
double NumPositions;

NumPositions = 0;
total=OrdersTotal();
OpenBuy=0;
OpenSell=0;
OpenBuyLimit=0;
OpenSellLimit=0;
OpenBuyStop=0;
OpenSellStop=0;
MaxLots=0;

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
if ( OrderSymbol() != Symbol()) continue;

if ( OrderMagicNumber() != MagicNumber) continue;


if (OrderComment()==WindowExpertName())
{
if(MaxLots<OrderLots()) MaxLots=OrderLots();
}
else
{
if(MaxLots<StrToDouble(OrderComment())) MaxLots=StrToDouble(OrderComment());
}

//Print ("MaxLots = " + MaxLots + " Comment = " + OrderComment() + " Expert Name = " + WindowExpertName());

if(OrderType() == OP_BUY )
{
OpenBuy=OpenBuy+OrderLots();
if(EntryPrice==0) EntryPrice=OrderOpenPrice();
}
if(OrderType() == OP_SELL )
{
OpenSell=OpenSell+OrderLots();
if(EntryPrice==0) EntryPrice=OrderOpenPrice();
}

if(OrderType() == OP_BUYLIMIT ) OpenBuyLimit=OpenBuyLimit+OrderLots();
if(OrderType() == OP_SELLLIMIT ) OpenSellLimit=OpenSellLimit+OrderLots();
if(OrderType() == OP_BUYSTOP ) {OpenBuyStop=OpenBuyStop+OrderLots(); LastBuyStopPrice=OrderOpenPrice();}
if(OrderType() == OP_SELLSTOP ) {OpenSellStop=OpenSellStop+OrderLots(); LastSellStopPrice=OrderOpenPrice();}
}
NumPositions = OpenBuy-OpenSell;
if(InclOpenOrder) NumPositions += OpenBuyLimit+OpenBuyStop-OpenSellLimit-OpenSellStop;
return (NumPositions);
}


void CloseLongs(int MagicNumber, double clots=0)
{
int trade, err;
double llots;

//Print("Close Longs:",MagicNumber,", Lots:",clots);
for(trade=OrdersTotal()-1;trade>=0;trade--)
{
if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=MagicNumber) continue;
if(OrderType()!=OP_BUY) continue;

if (clots==0) llots=OrderLots(); else llots=clots;
//Print("Ticket:",OrderTicket(),", MagicNumber:",OrderMagicNumber(),", Lots:",llots);
OrderClose(OrderTicket(),llots,Bid,Slippage,Blue);

err=GetLastError();
if(err!=0) Print("Error = ", err," - ",ErrorDescription(err));
}//for
}

void CloseShorts(int MagicNumber, double clots=0)
{
int trade, err;
double olots;
for(trade=OrdersTotal()-1;trade>=0;trade--)
{
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=MagicNumber) continue;
if(OrderType()!=OP_SELL) continue;

olots=OrderLots();
if (clots==0) clots=olots;
OrderClose(OrderTicket(),clots,Ask,Slippage,Red);

err=GetLastError();
if(err!=0) Print("Error = ", err," - ",ErrorDescription(err));
}//for
}


int DeleteOpenOrder(int aOrderType=-1)
{
int cnt;

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;

if(aOrderType==OrderType()) OrderDelete(OrderTicket());
else if(aOrderType==-1)
switch(OrderType())
{
case OP_BUYLIMIT:
case OP_SELLLIMIT:
case OP_BUYSTOP:
case OP_SELLSTOP: OrderDelete(OrderTicket()); break;
}
}
return(0);
}
void CheckStops(int tkt){
if (OrderSelect(tkt,SELECT_BY_TICKET,MODE_TRADES)){
double tp = NormalizeDouble(TakeProfit * point,5);
double sl = NormalizeDouble(StopLoss * point,5);
double otp = NormalizeDouble(MathAbs(OrderTakeProfit() - OrderOpenPrice()),5);
double osl = NormalizeDouble(MathAbs(OrderStopLoss() - OrderOpenPrice()),5);
if (otp!=tp)
Print ("TakeProfit not Equal tp=" + tp + " otp=" + otp + " tkt = " + tkt);
if (osl!=sl)
Print ("StopLoss not Equal sl=" + sl + " osl=" + osl + " tkt = " + tkt);
}
}
double LotSize(){
if (InitialRisk ==0) return (Lots);
double lot;
if (FiveDigitBroker)
lot=NormalizeDouble(AccountBalance( )*(InitialRisk/100)/StopLoss/((MarketInfo(Symbol(), MODE_TICKVALUE)*10)),LotDigits);
else
lot=NormalizeDouble(AccountBalance( )*(InitialRisk/100)/StopLoss/(MarketInfo(Symbol(), MODE_TICKVALUE)),LotDigits);
if (lot<Lots) lot = Lots;
return (lot);
}

 

For coder,how to make this ea work on ECN mt4

simple answer:

rewrite it for ECN

do you really think that experienced coders have nothing else to do than rewriting other lazy peoples indicators and expert advisors ?
 
meikel wrote >>

For coder,how to make this ea work on ECN mt4

simple answer:

rewrite it for ECN

do you really think that experienced coders have nothing else to do than rewriting other lazy peoples indicators and expert advisors ?

ok man,they told me to send order without tp sl then in the second line add modifyorder function with tp sl .but i want just to show me which sendorder in this code have been to change .and wher to put ordermodify function.i am not lazy,the answer is simple: iam not coder

 
aaabid2002:

i am not lazy,the answer is simple: iam not coder

if you are not lazy, you will become a good coder....

if you have enough money to have an account at an ECN broker and dont want to rewrite this EA by yourself, its a good behaviour to PAY for the work.

you pay your broker, and there is no reason why you dont should pay your coder.

my special offer is 500 US$ for rewriting, LOL

 
meikel wrote >>

if you are not lazy, you will become a good coder....

if you have enough money to have an account at an ECN broker and dont want to rewrite this EA by yourself, its a good behaviour to PAY for the work.

you pay your broker, and there is no reason why you dont should pay your coder.

ok ; it first experience for me i am still thinking.but if this ea work i will send decenttttttttt donation .

 
aaabid2002:

ok ; it first experience for me i am still thinking.but if this ea work i will send decenttttttttt donation .

thanks for your insight ;-)

believe me, you can solve the problem yourself in 7 days and can save some money.

read the book.

its just one line of code you have to add.

 
meikel wrote >>

thanks for your insight ;-)

believe me, you can solve the problem yourself in 7 days and can save some money.

read the book.

its just one line of code you have to add.

change this line : int OpenOrder(int aCmd, double aLots, double aPrice, int aSlipPage, int aStopLoss, int aTakeProfit, string aComment, int aMagic, datetime aExpiration, color aColor)
to :int OpenOrder(int aCmd, double aLots, double aPrice, int aSlipPage, 0, 0, string aComment, int aMagic, datetime aExpiration, color aColor)

then add :bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

or change this line !: order_ticket = OrderSend(Symbol(), aCmd, aLots, aPrice, aSlipPage, StopLong(aPrice, aStopLoss), TakeLong(aPrice, aTakeProfit), aComment, aMagic, aExpiration, aColor);

to : order_ticket = OrderSend(Symbol(), aCmd, aLots, aPrice, aSlipPage, StopLong(0), TakeLong(0), aComment, aMagic, aExpiration, aColor);

then add ; bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

please show the right change.

 

Its actually more than just one line of code to add.

Its a little more complex than that.

In pseudocode, you'll need to (at the very least):

- Open the order with SL and TP = 0.

- Check that the order has opened.

- Select the order in question.

- Modify the order.

- Check that the modify was done successfully.


First step, read the docs for OrderSend(), OrderSelect(), OrderModify() and GetLastError().


CB

 
#define NO_EXPIRATION 0
order.ticket    = OrderSend(Symbol(),       order.type,     order.lots,
                            now.open,       SlippagePips * pips2points,
                            0, 0,           // order.SL,    TP.dscPrt,
                            reason,         myMagic+ot,
                            NO_EXPIRATION,  clr );
if (order.ticket < 0) {
    Alert(  "OrderSend(type=",  order.type, " (",   order.type.text,
        "), lots=",     order.lots,
        ", price=", DoubleToStr( now.open,              Digits     ),
            " (",   DoubleToStr((now.open-Bid)/pips2dbl,Digits.pips),
        "), SL=0, TP=0, '", reason, "', ...) failed: ", GetLastError());
    RelTradeContext();  // set the trade context free
    return(-1);
}
if (!OrderSelect( order.ticket, SELECT_BY_TICKET )) {           Alert(
    "OrderSelect(",order.ticket, " by ticket) failed: ", GetLastError());
    RelTradeContext();  // set the trade context free
    return(-1);
}

// IBFX has variable spreads and too much time can pass between
// OrderSend and a following OrderModify without refresh and recomputing
refresh();  // SL.
order.price = OrderOpenPrice();     // Adjust in case of slippage
order.TP    = MathMaxDIR( order.TP
                        , order.price +DIR* minGap.stops
                        );
order.SL    = MathMinDIR( order.SL
                        , order.price -DIR*(minGap.stops + spread.close)
                        );
if (!OrderModify(   order.ticket,   order.price,    order.SL,
                    TP.dscPrt,      NO_EXPIRATION,  clr )) {    Alert(
    "OrderModify(ticket=",  order.ticket,
    ", price=", DoubleToStr(order.price, Digits),
        " (",   DoubleToStr((order.price-Bid)/pips2dbl, Digits.pips),
    "), SL=",   DoubleToStr(order.SL, Digits),
        " (",   DoubleToStr((Bid-order.SL)/pips2dbl,    Digits.pips),
    "), TP=" ,  DoubleToStr(TP.dscPrt, Digits),
        " (",   DoubleToStr((TP.dscPrt-Bid)/pips2dbl,   Digits.pips),
    "), '",     reason,     "', ...) failed: ", GetLastError(),
    ", bid=",   DoubleToStr(Bid, Digits) );
    RelTradeContext();  // set the trade context free
    return(-1);
}
 
WHRoeder wrote

thank you CloudBreaker and WHRoeder for your valiable advice,to be honest i am confused i tried the two solution but no result.perhaps i will this ea still refuse to work on ecn. i think it is a big big challenge .

please if you have any solution just put it here or if possible show the line to be changed for me and for this usefull forum,many thanks for you.


189

 
WHRoeder wrote >>

hi sir,could you please explaine where to put this in the code,cause i am really confused,as you know i am not good in coding i tried to learn but still out.

Reason: