Problem with making multi time frame EA

 

Hi 
I'm trying to make an EA which check some conditions in all time frames . whenever conditions output was true in one of time frames  it must  send the position .
my questions :

1- is it correct way to make it multi time ?

2 -  i don't know how to say if you sent a position don't repeat sending orders for the same time frame before next bar getting open .(I afraid if my English is not understandable ) 

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int HighParts = 4; // just to change the sensibility  for a condition 
input int TimeParts = 10; //just to change the sensibility  for a condition 
input double Lot=0.1;
input int TP=50;
input int SL=20;
long handle=ChartID();
double point;
int TF; //Time Frame
string tf;//TimeFrame as text for posiotion comment


double high_0; //High [0] in any TimeFrame
double high_1;

double low_0;
double low_1;

long vol_0;
long vol_1;
datetime OpTime_0;//Time[0] in any TimeFrame
datetime OpTime_1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---


   point=Point;
   if((Digits==3) || (Digits==5))
     {
      point*=10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {             
   TF=PERIOD_M1; SendPositions(TF);
   TF=PERIOD_M5;SendPositions(TF);
   TF=PERIOD_M15;SendPositions(TF);
   TF=PERIOD_M30;SendPositions(TF);
   TF=PERIOD_H1;SendPositions(TF);
   TF=PERIOD_H4;SendPositions(TF);
   TF=PERIOD_D1;SendPositions(TF);
   TF=PERIOD_W1;SendPositions(TF);
   TF=PERIOD_MN1;SendPositions(TF);
  }
//+------------------------------------------------------------------+
void SendPositions(int timeframe)
  {
   tf=string(timeframe);
   high_0=iHigh(NULL,timeframe,0);
   high_1=iHigh(NULL,timeframe,1);

   low_0=iLow(NULL,timeframe,0);
   low_1=iLow(NULL,timeframe,1);

   vol_0=iVolume(NULL,timeframe,0);
   vol_1=iVolume(NULL,timeframe,1);
   OpTime_0=iTime(NULL,timeframe,0);
   OpTime_1=iTime(NULL,timeframe,1);

   if(high_1==high_0 && low_1==low_0)
     {
      if(vol_0>vol_1)
        {
         if(TimeCurrent()-OpTime_0>=(((OpTime_0-OpTime_1)/TimeParts)*(TimeParts-1)))
           {
      
            if(Bid>=(high_0-((high_0-low_0)/HighParts)))
              {
               Alert(Symbol(),"Buy Position Opened");
               if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Bid-(SL*point),Bid+(TP*point),tf+" Nasimi Project2",0,0,clrBlue))
                  Print(GetLastError());
              }
            if(Bid<=(low_0+((high_0-low_0)/HighParts)))
              {
               Alert(Symbol(),"Sell Position Opend");
               if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Ask+(SL*point),Ask-(TP*point),tf+"Nasimi Project2",0,0,clrBlue))
                  Print(GetLastError());
              

              }
           }
        }}
  }

//+------------------------------------------------------------------+
 

I think I found the answer .

I wrote a Boolean function to check it .

If you have any idea for make it better or more correct , I'd like to learn .

I like to understand how professionals are thinking.



//+------------------------------------------------------------------+
//|                                                  2nd Project.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int HighParts = 4;
input int TimeParts = 10;
input double Lot=0.1;
input int TP=50;
input int SL=20;
long handle=ChartID();
double point;
int TF; //Time Frame
string tf;//TimeFrame as text for posiotion comment
double high_0; //High [0] in any TimeFrame
double high_1;

double low_0;
double low_1;

long vol_0;
long vol_1;
datetime OpTime_0;//Time[0] in any TimeFrame
datetime OpTime_1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   point=Point;
   if((Digits==3) || (Digits==5))
     {
      point*=10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   TF=PERIOD_M1; SendPositions(TF);
   TF=PERIOD_M5;SendPositions(TF);
   TF=PERIOD_M15;SendPositions(TF);
   TF=PERIOD_M30;SendPositions(TF);
   TF=PERIOD_H1;SendPositions(TF);
   TF=PERIOD_H4;SendPositions(TF);
   TF=PERIOD_D1;SendPositions(TF);
   TF=PERIOD_W1;SendPositions(TF);
   TF=PERIOD_MN1;SendPositions(TF);
  }
//+------------------------------------------------------------------+
void SendPositions(int timeframe)
  {

   tf=string(timeframe);
   high_0=iHigh(NULL,timeframe,0);
   high_1=iHigh(NULL,timeframe,1);

   low_0=iLow(NULL,timeframe,0);
   low_1=iLow(NULL,timeframe,1);

   vol_0=iVolume(NULL,timeframe,0);
   vol_1=iVolume(NULL,timeframe,1);
   OpTime_0=iTime(NULL,timeframe,0);
   OpTime_1=iTime(NULL,timeframe,1);
   

if(Allowed(TF,OpTime_0))
     {
      if(high_1==high_0 && low_1==low_0)
        {
         if(vol_0>vol_1)
           {
            if(TimeCurrent()-OpTime_0>=(((OpTime_0-OpTime_1)/TimeParts)*(TimeParts-1)))
              {

               if(Bid>=(high_0-((high_0-low_0)/HighParts)))
                 {

                  if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Bid-(SL*point),Bid+(TP*point),tf+" Nasimi Project2",0,0,clrBlue))
                     Print(GetLastError()); Comment(Symbol()," ",tf+"  Buy Position ");
                 }
               if(Bid<=(low_0+((high_0-low_0)/HighParts)))
                 {

                  if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Ask+(SL*point),Ask-(TP*point),tf+"Nasimi Project2",0,0,clrBlue))
                     Print(GetLastError());Comment(Symbol()," ",tf+"  Sell Position ");

                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
bool Allowed(int timframe,datetime BarOpenTime)
  {
   datetime opt=0;
   bool allowed=true;
   for(int i=OrdersTotal();i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderComment()==tf+" Nasimi Project2")
           {
            if(OrderOpenTime()>opt)
              {
               opt=OrderOpenTime();
              }
           }
        }
     }
   if(opt>=BarOpenTime)
     {
      allowed=false;
     }
   return(allowed);
  }
//+------------------------------------------------------------------+

 

That is how professionals are thinking.

Well done.

 
Marco vd Heijden:

That is how professionals are thinking.

Well done.


Hi Marco vd Heijden 

THANK YOU !!
I feel SOOOOOO GOOOOOD !!

Reason: