Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 138

 
missha689:
Dimmi come scoprire la data e l'ora di ieri

Beh, c'è tutto quello di cui avete bisogno, basta leggerlo. Come questo.

iTime("USDCHF",PERIOD_H1,0)
Basta sostituire il simbolo specificato con _Symbol, da PERIOD_H1 a PERIOD_D1 ed ecco l'ora di apertura del giorno. Sostituisci 0 con 1 per ottenere l'orario di apertura di ieri.
 
missha689:
Potete dirmi come trovare programmaticamente la data e l'ora di ieri?

calendario di ieri:

datetime tim=TimeCurrent()‌-24*60*60;

MqlDateTime ts;

TimeToStruct(tim,ts);

ts.hour=0;ts.min=0;ts.sec=0;

tim=StructToTime(ts);

ora in tim - inizio della giornata di calendario di ieri (!!! non l'ora di apertura del pre-bar D1)

Tempo di apertura del pre-bar D1 - iTime(0,PERIOD_D1,1); con piccola correzione - se è sabato, allora aggiungi 24 ore, se è domenica, allora 48 ore.

 
Alexey Viktorov:

Beh, c'è tutto quello di cui avete bisogno, basta leggerlo. Come questo.

iTime("USDCHF",PERIOD_H1,0)
Basta sostituire il simbolo specificato con _Symbol, da PERIOD_H1 a PERIOD_D1 ed ecco l'orario di apertura del giorno. Sostituisci 0 con 1 per ottenere l'orario di apertura di ieri.

Sto cercando di capire come farlo da ieri, ma non ci riesco, quindi chiedo aiuto, perché sono nuovo.

Per favore aiutatemi a trovare l'indice della barra di ieri alle 15:00 e l'indice della barra di oggi alle 7:00 solo senza specificare esplicitamente la data come mostrato nell'esempio

 
Maxim Kuznetsov:

calendario di ieri:

datetime tim=TimeCurrent()‌-24*60*60;

MqlDateTime ts;

TimeToStruct(tim,ts);

ts.hour=0;ts.min=0;ts.sec=0;

tim=StructToTime(ts);

ora in tim - inizio della giornata di calendario di ieri (!!! non il tempo di apertura del pre-bar D1)

Tempo di apertura del pre-bar D1 - iTime(0,PERIOD_D1,1); con piccola correzione - aggiungere 24 ore se è sabato, 48 ore se è domenica.

Grazie
 
Sergey Gritsay:


per trasferire lo stopband a lossless, il ticket dell'ordine e la distanza in pip sono passati alla funzione

void zero_profit(int ticket, int distance)
  {
   double sl=0.0;

   if(OrderSelect(ticket,SELECT_BY_TICKET))
     {
      if(OrderType()==OP_BUY)
        {
         if(Bid>=OrderOpenPrice() && Bid-OrderOpenPrice()>=distance*_Point) sl=OrderOpenPrice();
         if(OrderStopLoss()!=0 && OrderStopLoss()>=OrderOpenPrice())return;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=OrderOpenPrice() && OrderOpenPrice()-Ask>=distance*_Point) sl=OrderOpenPrice();
         if(OrderStopLoss()!=0 && OrderStopLoss()<=OrderOpenPrice())return;
        }
      ResetLastError();

      if(sl<=0)return;
      if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0))
        {
         int error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error modifying StopLoss order ",OrderTicket()," ",TypeToStr(OrderType())," №- ",error);
         Print(rezult);
        }

     }
  }


...grazie sergey!!!!!

 
Vitaly Muzichenko:

Bene, cercherò di inserire le funzioni nell'EA. Più tardi posterò il risultato.

Grazie!!!

Aggiunto un secondo metodo di ricerca.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "3.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "Upper Fractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "Lower Fractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//---
enum ENUM_TYPE_FRACTAL
  {
   TYPE_FRACTAL_ACCURATE   =  0,    // Accurate fractal
   TYPE_FRACTAL_INACCURATE =  1,    // Inaccurate fractal
  };
//--- input parameters
input ENUM_TYPE_FRACTAL TypeFractals   =  TYPE_FRACTAL_ACCURATE;  // Type of fractal
input int               LeftNumUp      =  2;                      // The number of bars on the left for upper fractals
int leftNumUp;    // Количество баров слева для верхнего фрактала
input int               RightNumUp     =  2;                      // The number of bars on the right for upper fractals
int rightNumUp;   // Количество баров справа для верхнего фрактала
input int               LeftNumDn      =  2;                      // The number of bars on the left for lower fractals
int leftNumDn;    // Количество баров слева для нижнего фрактала
input int               RightNumDn     =  2;                      // The number of bars on the right for lower fractals
int rightNumDn;   // Количество баров справа для нижнего фрактала
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexEmptyValue(1,EMPTY_VALUE);
//---
   leftNumUp=(LeftNumUp<1?1:LeftNumUp);
   rightNumUp=(RightNumUp<1?1:RightNumUp);
   leftNumDn=(LeftNumDn<1?1:LeftNumDn);
   rightNumDn=(RightNumDn<1?1:RightNumDn);
   string short_name=MQLInfoString(MQL_PROGRAM_NAME)+"("+(string)leftNumUp+","+(string)rightNumUp+")("+(string)leftNumDn+","+(string)rightNumDn+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<fmax(leftNumUp+rightNumUp,leftNumDn+rightNumDn)) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-fmax(leftNumUp,leftNumDn)-1;
      }
   //---
   for(int i=limit; i>fmin(rightNumUp,rightNumDn); i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNumUp,rightNumUp)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNumDn,rightNumDn)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   if(TypeFractals==TYPE_FRACTAL_ACCURATE) {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
      }
   else {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,shift)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)<GetPriceLow(symbol_name,timeframe,shift)) return(-1);
      }
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   if(TypeFractals==TYPE_FRACTAL_ACCURATE) {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
      }
   else {
      for(int i=shift-1; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,shift)) return(-1);
      for(int i=shift+1; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)>GetPriceHigh(symbol_name,timeframe,shift)) return(-1);
      }
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
File:
 
Artyom Trishkin:

Aggiunto un secondo metodo di ricerca.


Grazie, è semplicemente fantastico.

Resti da caricare su kodobase)

 
Vitaly Muzichenko:

Grazie, tutto è super.

Rimane da caricare sul kodobase)

Già fatto :))) L'ho inviato per il test.
 

Salve.

Sono su Linux. Ho diverse coppie di valute aperte in MT4 - fino a 10. Come posso usare MQL4 per disporre le schede del grafico in una certa sequenza?

Lavorare con i profili, studiare 1_MQL4.pdf e Internet non ha dato alcun risultato.

Saluti, Vladimir

 
DVlad:

Salve.

Sono su Linux. Ho diverse coppie di valute aperte in MT4 - fino a 10. Come posso usare MQL4 per disporre le schede del grafico in una certa sequenza?

Lavorare con i profili, studiare 1_MQL4.pdf e Internet non ha dato alcun risultato.

Saluti, Vladimir.

Anche su Windows, le schede non possono essere ordinate per mezzo di mql4.

Puoi aprire i grafici solo nella sequenza che ti serve e impostare i modelli necessari su di essi.

Motivazione: