//+------------------------------------------------------------------+ //| TrailingProfitVariation_EN.mq5 | //| Copyright 2012, Grebenev Slava | //| http://grebenev.narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, Grebenev Slava" //--- parámetros de entrada #define NTime 10000 // NTime número máximo de transacciones por paso #define OrderNumber 1 #define N 5 // número de barras para el cálculo de la media de tamaño de la barrae input int TP=500; // ganancia de trailing expresada como un porcentaje de la media de tamaño de la barra int digits; // número de dígitos después del punto decimal en el precio enum lastdeal {no,buy,sell}; // variable para almacenar la dirección del último trade (buy o sell) lastdeal ld=buy; datetime BarTime=D'01.01.1991'; // tiempo de la última barra int filehandle; // resultados variables para el comercio de la escritura en un archivo datetime Time[NTime]; double LastProfit[NTime]; double LP=0; int Itime=1; //+------------------------------------------------------------------+ //| Función de inicio del EA | //+------------------------------------------------------------------+ int OnInit() { SymbolSelect(_Symbol,true); digits=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS); // número de dígitos después del punto decimal en el dígito del precio ArrayInitialize(Time,D'01.01.2004'); ArrayInitialize(LastProfit,0.0); //MathSrand(random); //Seleccionar un número de ticket ganador, es decir, una secuencia de trades buy y sell return(0); } //+------------------------------------------------------------------+ //| Función de finalización del EA | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Este código escribe los resultados del trade en un archivo //--- es mejor no incluirlo a menos que realmente sea necesario - ahorra tiempo y espacio en disco duro /* ResetLastError(); filehandle=FileOpen("fractals.csv",FILE_READ|FILE_WRITE|FILE_CSV|FILE_SHARE_WRITE); FileSeek(filehandle, 0, SEEK_END); if(filehandle!=INVALID_HANDLE) { //FileWrite(filehandle,TimeCurrent(),Symbol()); for (int i=2;i0) { //--- Si los viejos tiempos no son iguales if(BarTime!=New_Time[0]) { if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("New bar",New_Time[0],"old bar",BarTime); //--- guardando la barra de tiempo BarTime=New_Time[0]; return(true); } } else { Alert("Error al copiar el valor de tiempo, número de error =",GetLastError()); ResetLastError(); return(false); } return(false); } //+------------------------------------------------------------------+ //| Elegir la dirección para entrar en mercado | //+------------------------------------------------------------------+ bool Direction() { // Elegir la dirección para entrar en el mercado. //bool r=(rand()>32768/2); //elegir una dirección al azar del movimiento del precio //return(r); if(ld==buy) {ld=sell; return(false);}; //entrada reservada if(ld==sell) {ld=buy; return(true);}; return(true); } //+------------------------------------------------------------------+ //| posición de apertura | //+------------------------------------------------------------------+ void Start() { double bet=0; //--- comprando o vendiendo dependiendo de la dirección elegida if(Direction()) { //--- trading usando el lote fijado bet=0.1; //--- comprando SendBuyOrder(bet); } else { bet=0.1; SendSellOrder(bet); } return; } //+------------------------------------------------------------------+ //| TrailingStop - mover el take profit | //+------------------------------------------------------------------+ void TrailingTake() { double ArrayHigh[N]; double ArrayLow[N]; CopyHigh(Symbol(),Period(),0,N,ArrayHigh); CopyLow(Symbol(),Period(),0,N,ArrayLow); double LastHeight=0; //ArrayHigh[0]-ArrayLow[0]; double LastPrice=SymbolInfoDouble(Symbol(),SYMBOL_LAST); for(int i=0; iLastHeight*TP/100*1.01) { //--- preparando una petición MqlTradeRequest request; ZeroMemory(request); //--- colocación de una orden inmediata request.action=TRADE_ACTION_SLTP; //--- instrumento request.symbol=Symbol(); //--- Stop Loss no especificado request.sl=0; request.tp=NormalizeDouble(LastPrice+LastHeight*TP/100,digits); MqlTradeResult result; ZeroMemory(result); MqlTradeCheckResult CheckResult; //--- enviando orden if(OrderCheck(request,CheckResult)) {OrderSend(request,result);} //--- imprimir la respuesta del servidor en el log else { Print(CheckResult.retcode," -error "); Print(__FUNCTION__,":",CheckResult.comment); }; } }; if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) if(MathAbs(-PositionGetDouble(POSITION_TP)+LastPrice)>LastHeight*TP/100*1.01) { //--- preparando una petición MqlTradeRequest request; ZeroMemory(request); //--- colocación de una orden inmediata request.action=TRADE_ACTION_SLTP; //--- instrumento request.symbol=Symbol(); //--- Stop Loss no especificado request.sl=0; request.tp=NormalizeDouble(LastPrice-LastHeight*TP/100,digits); MqlTradeResult result; ZeroMemory(result); MqlTradeCheckResult CheckResult; //--- enviando orden if(OrderCheck(request,CheckResult)) {OrderSend(request,result);} //--- imprimir la respuesta del servidor en el log else { Print(CheckResult.retcode," -error "); Print(__FUNCTION__,":",CheckResult.comment); }; } } return; } //+------------------------------------------------------------------+ //| SendBuyOrder - colocando una orden buy | //+------------------------------------------------------------------+ void SendBuyOrder(double bet) { MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) { //--- preparando una petición MqlTradeRequest request; ZeroMemory(request); //--- colocación de una orden inmediata request.action=TRADE_ACTION_DEAL; //--- ORDER_MAGIC request.magic=OrderNumber; //--- instrumento request.symbol=_Symbol; //--- volumen request.volume=bet; request.price=last_tick.ask; //--- Stop Loss no especificado request.sl=0; //--- Take Profit no specificado request.tp=0; //--- máxima desviación permitida desde el precio solicitado request.deviation=50; //--- tipo de orden request.type=ORDER_TYPE_BUY; MqlTradeResult result; ZeroMemory(result); MqlTradeCheckResult CheckResult; //--- enviando orden if(OrderCheck(request,CheckResult)) OrderSend(request,result); //--- imprimir la respuesta del servidor en el log else {Print(__FUNCTION__,":",result.comment); }; } else Print("SymbolInfoTick() fallido, error = ",GetLastError()); return; } //+------------------------------------------------------------------+ //| SendSellOrder - colocando orden sell | //+------------------------------------------------------------------+ void SendSellOrder(double bet) { MqlTick last_tick; if(SymbolInfoTick(_Symbol,last_tick)) { //--- preparando una petición MqlTradeRequest request; ZeroMemory(request); //--- colocación de una orden inmediata request.action=TRADE_ACTION_DEAL; //--- ORDER_MAGIC request.magic=OrderNumber; //--- instrumento request.symbol=_Symbol; //--- volumen request.volume=bet; request.price=last_tick.bid; //--- Stop Loss no especificado request.sl=0; //--- Take Profit no specificado request.tp=0; //--- tipo de orden request.type=ORDER_TYPE_SELL; MqlTradeResult result; ZeroMemory(result); MqlTradeCheckResult CheckResult; //--- enviando una orden de trade if(OrderCheck(request,CheckResult)) OrderSend(request,result); //--- imprimir la respuesta del servidor en el log else { Print(CheckResult.retcode," ",SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)); Print(__FUNCTION__,":",result.comment); }; if(result.retcode==10016) Print(result.bid,result.ask,result.price); } else Print("SymbolInfoTick() fallido, error = ",GetLastError()); return; } //+------------------------------------------------------------------+