mql4 частота обмена данными с длл

 
Здравствуйте. Вопрос такой. Есть эксперт, который использует длл. Я так понимаю, что обмен данными идет с каждым тиком. Возможно ли ограничить этот процесс например раз в час или в 30 минут в зависимости от выбранного таймфрейма.
 
Олег:
Здравствуйте. Вопрос такой. Есть эксперт, который использует длл. Я так понимаю, что обмен данными идет с каждым тиком. Возможно ли ограничить этот процесс например раз в час или в 30 минут в зависимости от выбранного таймфрейма.
Если нет исходного кода эксперта, то нет.
 
Alexey Volchanskiy:
Если нет исходного кода эксперта, то нет.
#import "MyDll.dll"
double _functionW1(const double &Buffer1[121],const double &Buffer2[121],const double &Buffer3[121],const double &Buffer4[121],const double &Buffer5[121],double & ExtMapBuffer23[145]);
#import

extern int TakeProfit    =26; // тейк-профит, пунктов от текущей цены
extern int StopLoss      =50; // стоп, пунктов от текущей цены
extern int Slippage      =6; //проскальзование
extern double digit=0;
double SL,TP;
bool select1,select2,close1,close2;
int Ticket1,Ticket2,Magic,Magic1;
double Lots =0.1;
int init()
{
if( Digits==3 || Digits==5)
{
TakeProfit *=10;
StopLoss   *=10;
Slippage   *=10;
}
return(0);
}

int start()
{

double Buffer1[121];
double Buffer2[121];
double Buffer3[121];
double Buffer4[121];
double Buffer5[121];

for(int j1=1; j1<=121; j1++)
{
Buffer1[121-j1]=iClose(NULL,0,j1*16-15);
Buffer2[121-j1]=iClose(NULL,0,j1*8-7);
Buffer3[121-j1]=iClose(NULL,0,j1*4-3);
Buffer4[121-j1]=iClose(NULL,0,2*j1-1);
Buffer5[121-j1]=iClose(NULL,0,j1); 
}
double ExtMapBuffer23[145];
ZeroMemory(ExtMapBuffer23);


int nDllResult = CallDllFunc(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5, ExtMapBuffer23);

if(nDllResult == 0)
{
        

if(openord()==0)
{

if (ExtMapBuffer23[120]<ExtMapBuffer23[121])
{
SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
int send1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"My order",111,0,clrBlue); 
}



if (ExtMapBuffer23[120]>ExtMapBuffer23[121])
{
SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
int send2=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"My order",222,0,clrRed); 
}
}
        


if (ExtMapBuffer23[120]>ExtMapBuffer23[121])
{
  select1=OrderSelect(0,SELECT_BY_POS);
  Magic=OrderMagicNumber();
if (Magic==111)
{
  Ticket1=OrderTicket();
  close1=OrderClose(Ticket1,Lots,Bid,Slippage,clrBlack);
}
} 


if (ExtMapBuffer23[120]<ExtMapBuffer23[121])
{
 select2=OrderSelect(0,SELECT_BY_POS);
 Magic1=OrderMagicNumber();
if (Magic1==222)
{
 Ticket2=OrderTicket();
 close2=OrderClose(Ticket2,Lots,Ask,Slippage,clrBlack);
}
}
}


return(0);
}

int CallDllFunc(const double  & Buffer1[],const double  & Buffer2[],const double  & Buffer3[],const double  & Buffer4[],const double  & Buffer5[], double & ExtMapBuffer23[])
{
        bool nRetValue = 0;
        
        // проверка параметров
        if(ArraySize(Buffer1) != 121 || ArraySize(ExtMapBuffer23) != 145)
        {
                
                nRetValue = -1;
        }
        else
        {
                // аргументы проверены на коррекнтость, теперь можно вызывать функцию из длл
                nRetValue = _functionW1(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5,ExtMapBuffer23);
        }
        
        return(nRetValue);
}
 // функция подсчета количества открытых ордеров
 int openord(){
 int ord=0;
 for(int cnt=0; cnt<OrdersTotal(); cnt++){
 if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true){
 if(OrderMagicNumber()==111 || OrderMagicNumber()==222) {
 if(OrderSymbol()==Symbol()){
 if(OrderType()<2) ord++;
 }
 }
 }
 }
 return(ord);
 }



 
Олег:

Вот так

 

extern PeriodMinutes = 30;
int CallDllFunc(const double  & Buffer1[],const double  & Buffer2[],const double  & Buffer3[],const double  & Buffer4[],const double  & Buffer5[], double & ExtMapBuffer23[])
{
        bool nRetValue = 0;
        static datetime dtLast = TimeCurrent();
        
        // проверка параметров
        if(ArraySize(Buffer1) != 121 || ArraySize(ExtMapBuffer23) != 145)
        {
                
                nRetValue = -1;
        }
        else
        {
                if(TimeCurremt() - dtLast > PeriodMinutes * 60)
                {    
                   // аргументы проверены на коррекнтость, теперь можно вызывать функцию из длл
                   nRetValue = _functionW1(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5,ExtMapBuffer23);
                   dtLast = TimeCurremt(); 
                }
        }
        
        return(nRetValue);
}
 

Ну тогда - проще простого:

...

int nDllResult = -1;
if (IsNewBar())
   nDllResult = CallDllFunc(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5, ExtMapBuffer23);

...

bool IsNewBar()
{
   static datetime lastBarTime = 0;
   if (lastBarTime == iTime(NULL, 0, 0))
      return false;

   lastBarTime = iTime(NULL, 0, 0);
   return true;
}
 
Ihor Herasko:

Ну тогда - проще простого

При чем тут привязка к новому бару? Требуется время задавать
 
Alexey Volchanskiy:
При чем тут привязка к новому бару? Требуется время задавать
спасибо большое!!
 
кончайте уже использовать статические переменные и учить этому тоже не надо.
 
почему такое предосудительное отношение к статическим переменным
 
Alexander Bereznyak:
почему такое предосудительное отношение к статическим переменным
Они не сбрасываются в ините. Этого достаточно чтобы заработать себе кучу проблем.
 
Alexey Oreshkin:
Они не сбрасываются в ините. Этого достаточно чтобы заработать себе кучу проблем.
Их смысл в этом и заключается - чтобы не сбрасывались при смене таймфрейма, например. Если нужно обнулять при перезапуске - обнуляйте явно.