preciso de uma ajuda para modificar um Ea
Olá a todos, mim escrevi aqui no fórum pois preciso de uma ajuda para modifica um EA, e entendo pouco de programação, gostaria de colocar
2 sistemas a mais no EA , o primeiro é quando abrir um ordem , e o Ea verificar que tem outra ordem aberta na posição contrariar fechar a mesma , o outro sistema é o de colocar um sistema de (extern double risk) risco para o Ea trabalhar, quem poder mim ajudar ficarei muito agradecido . ------------- o EA---------------------- int start() { if(Digits==4||Digits==2)ctldec=1; if(Digits==5||Digits==3)ctldec=10; double p=ctldec*Point; double spread=Ask-Bid; int cnt=0; int gle=0; int OrdersPerSymbol=0; // stoploss and takeprofit and close control double SL=0; double TP=0; double CurrentProfit=0; double CurrentBasket=0; // direction control bool BUYme=false; bool SELLme=false; // Trade stuff double ma0; double maHI; double maLO; double maOPEN; // bar counting if(bartime!=Time[0]) { bartime=Time[0]; bartick++; objtick++; TradeAllowed=true; } OrdersPerSymbol=0; for(cnt=OrdersTotal();cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { OrdersPerSymbol++; } } int Total = OrdersTotal(), // Numero Total de ordens no MetaTrader NumOrdensBuy = 0, // Numero de ordens buy neste consultor NumOrdensSell = 0, // Numero de ordens sell neste consultor i; // utilizado nos loops // Conta as ordens abertas por este sistema for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localização da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este número mágico if ((OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber)) { if (OrderType()==OP_BUY) NumOrdensBuy++; // Conta se for Buy if (OrderType()==OP_SELL) NumOrdensSell++; // Conta se for Sell } } // verifica se tem de fechar alguma ordem e a fecha for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localização da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este número mágico if ((OrderSymbol()==Symbol()) && // é deste par de moedas (OrderMagicNumber()==MagicNumber)) { // e é deste Consultor // se tem ordem aberta e for contraria ao sinal obtido então fecha if ((BUYme &&(NumOrdensSell>0)) || // Sina Buy com Ordem Sell Aberta (SELLme&&(NumOrdensBuy>0 ))) // ou Sina Sell com Ordem Buy Aberta // entao fechar essa ordem OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Red); } } //+-----------------------------+ //| Insert your indicator here | //| And set either BUYme or | //| SELLme true to place orders | //+-----------------------------+ // high and low of [1] and open of [0] either above or below the MA maHI=High[1]; maLO=Low[1]; maOPEN=Open[0]; ma0=iMA(Symbol(),0,MA_Period,0,MA_Mode,MA_Price,0) ; if(maHI>ma0 && maLO>ma0 && maOPEN>ma0) BUYme=true; if(maHI<ma0 && maLO<ma0 && maOPEN<ma0) SELLme=true; //+------------+ //| End Insert | //+------------+ //ENTRY LONG (buy, Ask) if(TradeAllowed && BUYme) { //Ask(buy, long) if(LossLimit ==0) SL=0; else SL=Ask-( (LossLimit +7)*ctldec*Point ); if(ProfitMade==0) TP=0; else TP=Ask+( (ProfitMade+7)*ctldec*Point ); OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, TradeComment,MagicNumber,White); gle=GetLastError(); if(gle==0) { Print("BUY Ask=",Ask," bartick=",bartick); ObjectCreate("myx"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], High[0]+(5*p)); ObjectSetText("myx"+DoubleToStr(objtick,0),"B",15, "Arial",Red); bartick=0; TradeAllowed=false; } else { Print("-----ERROR----- BUY Ask=",Ask," error=",gle," bartick=",bartick); } } //ENTRY SHORT (sell, Bid) if(TradeAllowed && SELLme) { //Bid (sell, short) if(LossLimit ==0) SL=0; else SL=Bid+((LossLimit+7)*ctldec*Point ); if(ProfitMade==0) TP=0; else TP=Bid-((ProfitMade+7)*ctldec*Point ); OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP ,TradeComment,MagicNumber,Red); gle=GetLastError(); if(gle==0) { Print("SELL Bid=",Bid," bartick=",bartick); ObjectCreate("myx"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], High[0]+(5*p)); ObjectSetText("myx"+DoubleToStr(objtick,0),"S",15, "Arial",Red); bartick=0; TradeAllowed=false; } else { Print("-----ERROR----- SELL Bid=",Bid," error=",gle," bartick=",bartick); } } //Basket profit or loss //CurrentBasket=AccountEquity()-AccountBalance(); //if( CurrentBasket>=BasketProfit || CurrentBasket<=(BasketLoss*(-1)) ) // { // CloseEverything(); // } |
Olá
Não entendo bem as questões, pois a primeira vejo que já está no próprio código. A segunda tem muitas respostas em por exemplo, mql4.com de onde tirei a que apresento abaixo: //+-------------------------------------------------------------------------------------------- #property copyright "AF" #property link "http://www.i9forex.com/" extern int MGN=1; extern int TradeRisk=1; extern int StopLoss=35; double p=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- int ctldec=1; if(Digits==5||Digits==3)ctldec=10; p=ctldec*Point; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // codigo fLots(StopLoss); // Seria melhor, que o StopLoss fosse dinamico e não fixo. // codigo p/ ABRIR fFechaContra(1); // Se Ordem aberta é SELL fFechaContra(2); // Se Ordem aberta é BUY //---- return(0); } //+------------------------------------------------------------------+ void fFechaContra(int Tipo) { int nP=OrdersTotal(), nBUY=0,nSELL=0; for(int i=0;i<nP;i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){ if (OrderSymbol() == Symbol() && OrderMagicNumber() == MGN ) { if(Tipo == 1 && OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(Or derSymbol(),MODE_BID),999,Red); if(Tipo == 2 && OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(Or derSymbol(),MODE_ASK),999,Orange); } } } } double fLots( int StopLoss) { double MinLot = MarketInfo(Symbol(), MODE_MINLOT); double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT); double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); double lots=0.0; lots = (AccountEquity() * TradeRisk / 100) / (StopLoss * MarketInfo(Symbol(),MODE_TICKVALUE)); lots /= LotStep; lots = NormalizeDouble(lots, 0); lots *= LotStep; if(lots>MaxLot) lots=MaxLot; if(lots<MinLot) lots=0.0; return(lots); } //+-------------------------------------------------------------------------------------------- Um comentário mais: É bom que te habitues a organizar o código e a optimizá-lo afim de não ser repetitivo e de difícil leitura Ex: Este código, que não varia, nem cada hora, nem cada dia, deve estar em INIT e não em START int init() { //---- int ctldec=1; if(Digits==5||Digits==3)ctldec=10; p=ctldec*Point; //---- INIT só se executa ao inicio ( ou quando se fecha e abre o EA ). START se executa em cada variação da cotação no MT4. NB: Retiro o de difícil leitura, pois é aqui o forum que estraga o que se 'cola' aqui... |
OLá, obrigado , qui no fórum fica meio ruim para passar os códigos, vou passar o EA completo , para vc ver o que poderia ser mudado. Eu gostaria de add no ea era um sistema para fechar todas as posições quando tiver um sinal contrario das posições já abertas, não deixar duas posções aberta ex; uma de sell e buy. o outro sistema é para deixar o EA trabalhar com sistema risco (EX risk de 5%). ate mais!
O EA------------------------------ /* +--------+ |Divergence Trader -- v11 has no divergence. How 'bout that! +--------+ */ #property copyright "Ron Thompson" #property link "http://www.lightpatch.com/forex" // user input int ctldec=0; extern double Lots=0.01; // how many lots to trade at a time extern int MA_Period=88; extern int MA_Price = PRICE_OPEN; extern int MA_Mode = MODE_EMA; extern double ProfitMade=25; // how much money do you expect to make extern double LossLimit=115; // how much loss can you tolorate //extern int BasketProfit=10; // if equity reaches this level, close trades //extern int BasketLoss=9999; // if equity reaches this negative level, close trades extern int PLBreakEven=5; // set break even when this many pips are made (999=off) int Slippage=2; // how many pips of slippage can you tolorate // naming and numbering int MagicNumber = 200601182020; // allows multiple experts to trade on same account string TradeComment = "Divergence_07_"; // Bar handling datetime bartime=0; // used to determine when a bar has moved int bartick=0; // number of times bars have moved int objtick=0; // used to draw objects on the chart int tickcount=0; // Trade control bool TradeAllowed=true; // used to manage trades //+-------------+ //| Custom init | //|-------------+ // Called ONCE when EA is added to chart or recompiled int init() { int i; string o; //remove the old objects for(i=0; i<Bars; i++) { o=DoubleToStr(i,0); ObjectDelete("myx"+o); ObjectDelete("myz"+o); } objtick=0; ObjectDelete("Cmmt"); ObjectCreate( "Cmmt", OBJ_TEXT, 0, Time[20], High[20]+(5*ctldec*Point) ); ObjectSetText("Cmmt","Divergence=X.XXXX",10,"Arial ",White); Print("Init happened ",CurTime()); Comment(" "); } //+----------------+ //| Custom DE-init | //+----------------+ // Called ONCE when EA is removed from chart int deinit() { int i; string o; //remove the old objects for(i=0; i<Bars; i++) { o=DoubleToStr(i,0); ObjectDelete("myx"+o); ObjectDelete("myz"+o); } objtick=0; Print("DE-Init happened ",CurTime()); Comment(" "); } //+-----------+ //| Main | //+-----------+ // Called EACH TICK and each Bar[] int start() { if(Digits==4||Digits==2)ctldec=1; if(Digits==5||Digits==3)ctldec=10; double p=ctldec*Point; double spread=Ask-Bid; int cnt=0; int gle=0; int OrdersPerSymbol=0; // stoploss and takeprofit and close control double SL=0; double TP=0; double CurrentProfit=0; double CurrentBasket=0; // direction control bool BUYme=false; bool SELLme=false; // Trade stuff double ma0; double maHI; double maLO; double maOPEN; // bar counting if(bartime!=Time[0]) { bartime=Time[0]; bartick++; objtick++; TradeAllowed=true; } OrdersPerSymbol=0; for(cnt=OrdersTotal();cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { OrdersPerSymbol++; } } int Total = OrdersTotal(), // Numero Total de ordens no MetaTrader NumOrdensBuy = 0, // Numero de ordens buy neste consultor NumOrdensSell = 0, // Numero de ordens sell neste consultor i; // utilizado nos loops // Conta as ordens abertas por este sistema for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localização da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este número mágico if ((OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber)) { if (OrderType()==OP_BUY) NumOrdensBuy++; // Conta se for Buy if (OrderType()==OP_SELL) NumOrdensSell++; // Conta se for Sell } } // verifica se tem de fechar alguma ordem e a fecha for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localização da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este número mágico if ((OrderSymbol()==Symbol()) && // é deste par de moedas (OrderMagicNumber()==MagicNumber)) { // e é deste Consultor // se tem ordem aberta e for contraria ao sinal obtido então fecha if ((BUYme &&(NumOrdensSell>0)) || // Sina Buy com Ordem Sell Aberta (SELLme&&(NumOrdensBuy>0 ))) // ou Sina Sell com Ordem Buy Aberta // entao fechar essa ordem OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Red); } } //+-----------------------------+ //| Insert your indicator here | //| And set either BUYme or | //| SELLme true to place orders | //+-----------------------------+ // high and low of [1] and open of [0] either above or below the MA maHI=High[1]; maLO=Low[1]; maOPEN=Open[0]; ma0=iMA(Symbol(),0,MA_Period,0,MA_Mode,MA_Price,0) ; if(maHI>ma0 && maLO>ma0 && maOPEN>ma0) BUYme=true; if(maHI<ma0 && maLO<ma0 && maOPEN<ma0) SELLme=true; //+------------+ //| End Insert | //+------------+ //ENTRY LONG (buy, Ask) if(TradeAllowed && BUYme) { //Ask(buy, long) if(LossLimit ==0) SL=0; else SL=Ask-( (LossLimit +7)*ctldec*Point ); if(ProfitMade==0) TP=0; else TP=Ask+( (ProfitMade+7)*ctldec*Point ); OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, TradeComment,MagicNumber,White); gle=GetLastError(); if(gle==0) { Print("BUY Ask=",Ask," bartick=",bartick); ObjectCreate("myx"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], High[0]+(5*p)); ObjectSetText("myx"+DoubleToStr(objtick,0),"B",15, "Arial",Red); bartick=0; TradeAllowed=false; } else { Print("-----ERROR----- BUY Ask=",Ask," error=",gle," bartick=",bartick); } } //ENTRY SHORT (sell, Bid) if(TradeAllowed && SELLme) { //Bid (sell, short) if(LossLimit ==0) SL=0; else SL=Bid+((LossLimit+7)*ctldec*Point ); if(ProfitMade==0) TP=0; else TP=Bid-((ProfitMade+7)*ctldec*Point ); OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP ,TradeComment,MagicNumber,Red); gle=GetLastError(); if(gle==0) { Print("SELL Bid=",Bid," bartick=",bartick); ObjectCreate("myx"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], High[0]+(5*p)); ObjectSetText("myx"+DoubleToStr(objtick,0),"S",15, "Arial",Red); bartick=0; TradeAllowed=false; } else { Print("-----ERROR----- SELL Bid=",Bid," error=",gle," bartick=",bartick); } } //Basket profit or loss //CurrentBasket=AccountEquity()-AccountBalance(); //if( CurrentBasket>=BasketProfit || CurrentBasket<=(BasketLoss*(-1)) ) // { // CloseEverything(); // } // CLOSE order if profit target made for(cnt=OrdersTotal();cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber ) { if(OrderType()==OP_BUY) { CurrentProfit=Bid-OrderOpenPrice() ; // modify for break even if (CurrentProfit >= PLBreakEven*p && OrderOpenPrice()>OrderStopLoss()) { SL=OrderOpenPrice()+(spread*2); TP=OrderTakeProfit(); OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP, White); gle=GetLastError(); if(gle==0) { Print("MODIFY BREAKEVEN BUY Bid=",Bid," bartick=",bartick); ObjectCreate("myz"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], Low[0]-(7*p)); ObjectSetText("myz"+DoubleToStr(objtick,0),"BE",15 ,"Arial",White); } else { Print("-----ERROR----- MODIFY BREAKEVEN BUY Bid=",Bid," error=",gle," bartick=",bartick); } } // did we make our desired BUY profit // or did we hit the BUY LossLimit if((ProfitMade>0 && CurrentProfit>=(ProfitMade*p)) || (LossLimit>0 && CurrentProfit<=((LossLimit*(-1))*p)) ) { OrderClose(OrderTicket(),Lots,Bid,Slippage,White); gle=GetLastError(); if(gle==0) { Print("CLOSE BUY Bid=",Bid," bartick=",bartick); ObjectCreate("myz"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], Low[0]-(7*p)); ObjectSetText("myz"+DoubleToStr(objtick,0),"C",15, "Arial",White); } else { Print("-----ERROR----- CLOSE BUY Bid=",Bid," error=",gle," bartick=",bartick); } } } // if BUY if(OrderType()==OP_SELL) { CurrentProfit=OrderOpenPrice()-Ask; // modify for break even if (CurrentProfit >= PLBreakEven*p && OrderOpenPrice()<OrderStopLoss()) { SL=OrderOpenPrice()-(spread*2); TP=OrderTakeProfit(); OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP, Red); gle=GetLastError(); if(gle==0) { Print("MODIFY BREAKEVEN SELL Ask=",Ask," bartick=",bartick); ObjectCreate("myz"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], Low[0]-(7*p)); ObjectSetText("myz"+DoubleToStr(objtick,0),"BE",15 ,"Arial",Red); } else { Print("-----ERROR----- MODIFY BREAKEVEN SELL Ask=",Ask," error=",gle," bartick=",bartick); } } // did we make our desired SELL profit? if( (ProfitMade>0 && CurrentProfit>=(ProfitMade*p)) || (LossLimit>0 && CurrentProfit<=((LossLimit*(-1))*p)) ) { OrderClose(OrderTicket(),Lots,Ask,Slippage,Red); gle=GetLastError(); if(gle==0) { Print("CLOSE SELL Ask=",Ask," bartick=",bartick); ObjectCreate("myz"+DoubleToStr(objtick,0), OBJ_TEXT, 0, Time[0], Low[0]-(7*p)); ObjectSetText("myz"+DoubleToStr(objtick,0),"C",15, "Arial",Red); } else { Print("-----ERROR----- CLOSE SELL Ask=",Ask," error=",gle," bartick=",bartick); } } } //if SELL } // if(OrderSymbol) } // for } // start() //+-----------------+ //| CloseEverything | //+-----------------+ // Closes all OPEN and PENDING orders int CloseEverything() { double myAsk; double myBid; int myTkt; double myLot; int myTyp; int i; bool result = false; for(i=OrdersTotal();i>=0;i--) { OrderSelect(i, SELECT_BY_POS); myAsk=MarketInfo(OrderSymbol(),MODE_ASK); myBid=MarketInfo(OrderSymbol(),MODE_BID); myTkt=OrderTicket(); myLot=OrderLots(); myTyp=OrderType(); switch( myTyp ) { //Close opened long positions case OP_BUY :result = OrderClose(myTkt, myLot, myBid, Slippage, Red); break; //Close opened short positions case OP_SELL :result = OrderClose(myTkt, myLot, myAsk, Slippage, Red); break; //Close pending orders case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT: case OP_SELLSTOP :result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , myTkt , " failed to close. Error:" , GetLastError() ); Print("Order " , myTkt , " failed to close. Error:" , GetLastError() ); Sleep(3000); } Sleep(1000); } //for } // closeeverything |
Todas horas estão no fuso horário GMT. A hora actual é 05:10. |
Powered by vBulletin Version 3.6.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.