//+------------------------------------------------------------------+
//|  x1000 en 1 an capital  sur russel2000 M1 spread 3    lm_macd_ea.mq4 |
//|                                                               LM |
//|                                                http:\c-simple.fr |
//+------------------------------------------------------------------+
#property copyright "LM"
#property link      "http:\\c-simple.fr"
#property version   "1.00"
#property strict

extern double buy_ecart_atr_pourcent =0.022;
extern int buy_stop = 12;
extern int buy_tp1 =56;  
extern int buy_macd_rapide = 4;
extern int buy_macd_lent = 11;
extern int buy_per_signal =5;
extern int buy_shift = 2;
// -0.8 si baisse heinshi aki day et +0.8 si hausse
extern double haut_zone_achat_atr_pourcent =0.8; 

extern double sell_ecart_atr_pourcent =0.019;
extern int sell_stop = 15;
extern int sell_tp1 =56;  
extern int sell_macd_rapide = 4;
extern int sell_macd_lent = 9;
extern int sell_per_signal =5;
extern int sell_shift = 2;
// -0.9 si baisse heinshi aki day et +0.9 si hausse
extern double bas_zone_vente_atr_pourcent =0.9;  
/* 2 ci-dessous peu utile
extern double bas_zone_achat_atr_pourcent =-2.75; 
extern double haut_zone_vente_atr_pourcent =1.7;  */

// 1 testé idéal
extern double pourcentage_investi =1; 

double buy_macd0,buy_signal0,buy_macd1,buy_signal1,buy_ecart_atr;
double sell_macd0,sell_signal0,sell_macd1,sell_signal1,sell_ecart_atr;

double bas_zone_vente_atr,haut_zone_achat_atr; //,haut_zone_vente_atr,bas_zone_achat_atr;
double marge_par_mini_lot,marge_a_miser,taille_lot,atr,spread;
int position_en_cours =0;  // nb
int ordre_ok;
datetime dtime,last_dtime;

    /* **************************************
     
     - test toutes les semaines
     - ajouter vrai shift
     - shift devient decallage_macd_signal
     - enum - extern ( choix de gestion des lots )
     
     ************************************** */

int OnInit()
  {
   last_dtime=TimeCurrent();
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {  
  }

void Calc_Lot()
  {
   marge_par_mini_lot=MarketInfo(NULL,MODE_MARGINREQUIRED)*MarketInfo(NULL,MODE_MINLOT);
   marge_a_miser=pourcentage_investi*AccountFreeMargin();
   taille_lot = MathFloor(marge_a_miser/marge_par_mini_lot)*MarketInfo(NULL,MODE_MINLOT); // 0.9 à 135usd le lot pour un compte de 200 usd, 120 usd de marge
  }
  
bool Acheter_Si_Ok()
  {
    buy_ecart_atr=atr*buy_ecart_atr_pourcent; // pour comparer macd et son signal   
    
    buy_macd0=iMACD(NULL,1,buy_macd_rapide,buy_macd_lent,buy_per_signal,PRICE_TYPICAL,MODE_MAIN,0);
    buy_signal0=iMACD(NULL,1,buy_macd_rapide,buy_macd_lent,buy_per_signal,PRICE_TYPICAL,MODE_SIGNAL,0);
    buy_macd1=iMACD(NULL,1,buy_macd_rapide,buy_macd_lent,buy_per_signal,PRICE_TYPICAL,MODE_MAIN,buy_shift);
    buy_signal1=iMACD(NULL,1,buy_macd_rapide,buy_macd_lent,buy_per_signal,PRICE_TYPICAL,MODE_SIGNAL,buy_shift);

         
    // conditione d'achat ***********************************
    haut_zone_achat_atr=atr*haut_zone_achat_atr_pourcent; // on trade si macd dans la zone
    //bas_zone_achat_atr=atr*bas_zone_achat_atr_pourcent;              

    bool ca1=buy_signal0<buy_macd0-buy_ecart_atr; 
    bool ca2=buy_signal1>buy_macd1-buy_ecart_atr;
    bool ca3=buy_macd0<haut_zone_achat_atr;
    //bool ca4=macd0>bas_zone_achat_atr;
        
    if (ca1 && ca2 && ca3)  // acheter
     {
      Calc_Lot();
      ordre_ok=OrderSend(NULL,OP_BUY,taille_lot,Ask,3,NormalizeDouble(Bid-buy_stop*spread,Digits)
               ,NormalizeDouble(Ask+buy_tp1*spread,Digits),"Spread="+DoubleToStr(spread,2)+" ",1,0,Green);                        
      return(True);
     }
    return(False);  
  }
  
bool Vendre_Si_Ok()
  {
    sell_ecart_atr=atr*sell_ecart_atr_pourcent; // pour comparer macd et son signal   
    
    sell_macd0=iMACD(NULL,1,sell_macd_rapide,sell_macd_lent,sell_per_signal,PRICE_TYPICAL,MODE_MAIN,0);
    sell_signal0=iMACD(NULL,1,sell_macd_rapide,sell_macd_lent,sell_per_signal,PRICE_TYPICAL,MODE_SIGNAL,0);
    sell_macd1=iMACD(NULL,1,sell_macd_rapide,sell_macd_lent,sell_per_signal,PRICE_TYPICAL,MODE_MAIN,sell_shift);
    sell_signal1=iMACD(NULL,1,sell_macd_rapide,sell_macd_lent,sell_per_signal,PRICE_TYPICAL,MODE_SIGNAL,sell_shift);                      

    // conditione de vente ******************************
 
    bas_zone_vente_atr=atr*bas_zone_vente_atr_pourcent;   // on trade si macd dans la zone
    //haut_zone_vente_atr=atr*haut_zone_vente_atr_pourcent;      
                
    bool cv1=sell_signal0>sell_macd0+sell_ecart_atr; 
    bool cv2=sell_signal1<sell_macd1+sell_ecart_atr;
    bool cv3=sell_macd0>bas_zone_vente_atr;
    //bool cv4=macd0<haut_zone_vente_atr;
    
    if (cv1 && cv2 && cv3 )  // vendre
     {
      Calc_Lot();
      ordre_ok=OrderSend(NULL,OP_SELL,taille_lot,Bid,3,NormalizeDouble(Ask+sell_stop*spread,Digits)
               ,NormalizeDouble(Bid-sell_tp1*spread,Digits),"Spread="+DoubleToStr(spread,2)+" ",1,0,Red); 
      return(True);     
     }   
    return(False); 
  }

void OnTick()
  {
    // Accélère le mode réel comme le mode test 
    Sleep(60000); // 1 calcul par minute en mode réel
    dtime=TimeCurrent();
    if ( dtime+60 < last_dtime ) return; // 1 calcul par minute en mode test de statégie car sleep n'y fonctionne pas

    last_dtime=dtime;
    position_en_cours=OrdersTotal();
    bool c0=position_en_cours==0;
    if (!c0) return;

    spread=Ask-Bid;
    atr=iATR(NULL,1,14,0);
    bool c1=atr>spread;
    if (!c1) return;
    
    if (Acheter_Si_Ok()) return;
    Vendre_Si_Ok();
  }
//+------------------------------------------------------------------+
