Canal Forex

Canal Forex (http://www.canalforex.com/forum/index.html)
-   Sistemas de Trading Mecânicos para Forex (http://www.canalforex.com/forum/forumdisplay.html?f=10)
-   -   preciso de uma ajuda para modificar um Ea (http://www.canalforex.com/forum/showthread.html?t=421)

danieldavid 17-02-2011 14:56

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();
// }

afernandes 24-02-2011 09:03

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...

danieldavid 24-02-2011 12:55

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.