Archivio blog

giovedì 13 giugno 2013

ExpertAvisor_TwoEMACross



//Optimization Result => Lots=0.16 MaxR=0.06 DcF=10 ShortEma=3 LongEma=9 pATR=5
//Period 03/06/2012 - 09/06/2013 

//+------------------------------------------------------------------+
//|                                                   MyFirstOne.mq4 |
//|                                              Riccardo Placitelli |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

//MMM.

#property copyright "Riccardo Placitelli"
#property link      "http://www.metaquotes.net"

//---
#include <stdlib.mqh>
#include <stderror.mqh>
//---
#define MAGICMA 1985
//---

//--- input parameters
extern double    Lots=0.1;
extern double    MaxR=0.02;
extern double    DcF=3.0;
extern double    Trailing=30.0; // out of order
extern int       ShortEma=7;
extern int       LongEma=19;
extern int       pATR=4;
extern bool      SndMl=true;
extern bool      IsFloatLots=true;

//---global variable
double Atr;
//+------------------------------------------------------------------+
//| Calculate open Position                                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
   {
    int buys=0,sells=0;
    //---
    for(int i=0;i<OrdersTotal();i++)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
         {
          if(OrderType()==OP_BUY) buys++;
          if(OrderType()==OP_SELL) sells++;
         }
      }
//---return orders Volume
   if(buys>0)return(buys);
   else    return(-sells);
   }
//+------------------------------------------------------------------+
//| Calculate optimal Lot size                                       |
//+------------------------------------------------------------------+
   double LotsOptimized()
   {
       double lot=Lots;
       if(IsFloatLots==true)
       {
           int orders=OrdersHistoryTotal();
           int losses=0;
       //---select lot size
       lot=NormalizeDouble(AccountFreeMargin()*MaxR/1000.0,1);
       //---calculate number of losses orders without a break
       if(DcF>0)
         {
          for(int i=orders-1; i>=0; i--)
            {
             if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
               {
                Print("Error on History!");
                break;
               }
             if(OrderSymbol()!=Symbol()||OrderType()>OP_SELL)
             continue;
             //---
             if(OrderProfit()>0)
             break;
             if(OrderProfit()<0)
             losses++;
            }
          if(losses>1)lot=NormalizeDouble(lot-lot*losses/DcF,1);
         } 
       }
//---return lot size
   if(lot<0.1)lot=0.1;
   return(lot);
   }   
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double Ema_0,Ema_1,Lma_0;
   string sHeaderLetter,sBodyLetter;
   int res;
//---go trading only for first tick of new Bars
   if(Volume[0]>1)
   return;
//---get Atr
   Atr= iATR(NULL,0,pATR,1);
//---get moving average
   Ema_0= iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
   Ema_1= iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
   Lma_0= iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0);
//---sell conditions
   if(Ema_1>Lma_0 && Ema_0<Lma_0)
      {
       res= OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+Atr,0,"",MAGICMA,0,Red);
       if(SndMl==true && res!=-1)
         {
          sHeaderLetter="Operation Sell by" + Symbol() + "";
          sBodyLetter="Order Sell by "+Symbol()+"at"+DoubleToStr(Bid,4)+", and set StopLoss at "+DoubleToStr(Bid+Atr,4)+" ";
          SendMail(sHeaderLetter,sBodyLetter);
         }
          return;
      }
//----buy conditions
   if(Ema_1<Lma_0 && Ema_0>Lma_0)
      {
       res= OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-Atr,0,"",MAGICMA,0,Green);
       if(SndMl==true && res!=-1)
         {
          sHeaderLetter="Operation Buy by" + Symbol() + "";
          sBodyLetter="Order Buy by "+Symbol()+"at"+DoubleToStr(Ask,4)+", and set StopLoss at "+DoubleToStr(Ask-Atr,4)+" ";
          SendMail(sHeaderLetter,sBodyLetter);
         }
       return;
      }
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
   {
    double Ema_0,Ema_1,Lma_0;
//----go treding only for first ticks of new Bars
   if(Volume[0]>1)
   return;
//---get moving average
   Ema_0= iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
   Ema_1= iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
   Lma_0= iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0);
//---
   for(int i=0; i<OrdersTotal();i++)
      {
       if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)==false)   break;
       if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())   continue;
       //---check order type
       if(OrderType()==OP_BUY)
         { 
          if(Ema_1>Lma_0 && Ema_0<Lma_0)
          OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
          break;
         }
       if(OrderType()==OP_SELL)
         {
          if(Ema_1<Lma_0 && Ema_0>Lma_0)
          OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
          break;
         }
      }
//---
  }
//+------------------+
//| Start function   |
//+------------------+
void start()
   {
//---check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
   return;
//---calculate open orders by current Symbol
   if(CalculateCurrentOrders(Symbol())==0)
   CheckForOpen();
   else
   CheckForClose();
//---
   }
//+------------------------------------------------------------------+

Nessun commento:

Posta un commento

condividi la tua opinione...