포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 816

 

kakraz는 "인용 기록 보관소"를 실험했습니다. 각 차트에 대한 기록을 개별적으로 업데이트하여 일부 이국적인 쌍을 제외하고 거의 모든 차트에 대해 모든 것이 올바르게 작동하기 시작했음을 달성했습니다. 몇 번 삭제하고 업데이트했습니다. 차트에 대한 새 데이터가 없습니다. 일반적으로 문제가 해결되었다고 말할 수 있습니다.


효율성에 감사드립니다))))

 

친애하는 프로그래머들...문제가 있었습니다... EA를 만들었습니다 ...거래를 정상적으로 엽니다(테스터에서)....하지만 매수 거래만 닫습니다...테스트 확인 후에만 매도 거래를 닫습니다. ..여기 조각 코드가 있습니다 ... 도와 주실 수 있습니까?

 

//---------------------------------------------------------------------------------------------------------

void CloseSell() 

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true) 

      {   

      if (OrderSymbol() == Symbol()) 

         {

            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) 

               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Green);

         }

      }

   }

}

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

void CloseBuy() 

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)

      {

         if (OrderSymbol() == Symbol()) 

         {

            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) 

               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green);

         }

      }

   }

}

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

void OpenSellOrder()

{

   mlots = GetLots();

   

   if (AutoSL) sl = CalcSL(OP_SELL);

   else sl = ND(Bid - StopLoss*Point);

   

   tp = ND(Bid - TakeProfit*Point);

   

   ticket = OrderSendReliable(Symbol(), OP_SELL,  mlots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);

   if(ticket > 0)

      OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);


}

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

int OpenBuyOrder()

{

   mlots = GetLots();

   

   if (AutoSL) sl = CalcSL(OP_BUY);

   else sl = ND(Bid - StopLoss*Point);


   tp = ND(Ask + TakeProfit*Point);


   ticket = OrderSendReliable(Symbol(), OP_BUY,  mlots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);

   if(ticket > 0)

      OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);

}

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

void ModifyLoss()

{

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)

      {

         if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;

         if (OrderType() == OP_BUY)

         {

            sl = ND(OrderOpenPrice() + LossPoints*Point);

            if (OrderStopLoss() < sl && (Ask - OrderOpenPrice())/Point >= LossLimit)

            {

               if (sl != ND(OrderStopLoss()))

                  OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);

            }

         } 

         else

         if (OrderType() == OP_SELL)

         {

            sl = ND(OrderOpenPrice() - LossPoints*Point);

            if (OrderStopLoss() > sl && (OrderOpenPrice()-Bid)/Point >= LossLimit)

            {

               if (sl != ND(OrderStopLoss()))

                  OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);

            }

         }

      }

   }

}

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

double CalcSL(int otype)

{

   double sloss = 10000000;

   

   if (otype == OP_BUY)

   {

      double min;

      for (int i=1; i<=SLBars; i++) 

      {

         min = iLow(NULL, 0, i);

         if (min < sloss)

            sloss = min;

      }

      

      sloss = ND(sloss - SLPips*Point);

      if ((Ask-sloss)/Point < MinSL)

         sloss = ND(Ask - MinSL*Point);

             

      if ((Ask - sloss)/Point > MaxSL)

         sloss = ND(Ask - MaxSL*Point);

      else 

         sloss = ND(sloss - SLPips*Point);


      return(sloss);

   }

   else

   if (otype == OP_SELL)

   {

      double max;

      sloss = 0;

      

      for (i=1; i<=SLBars; i++) 

      {

         max = iHigh(NULL, 0, i);

         if (max > sloss)

            sloss = max;

      }

      

      if ((sloss - Bid)/Point < MinSL)

         sloss = ND(Bid + MinSL*Point);

          

      if ((sloss - Bid)/Point > MaxSL)

         sloss = ND(Bid + MaxSL*Point);

      else

         sloss = ND(sloss + SLPips*Point); 


      return(sloss);

   }

   return(0);

}

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

double GetLots()

{

   if (!UseMM) return(FixLot);


   double clots;

   clots = AccountBalance()    / 10000.0 * LotsFor10000;

   clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT));

   clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT));

   clots = NormalizeDouble(clots, 2);

   return (clots);

}

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

int CountBuy() 

{

   int count = 0;

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

             count++;

      }

   }

   return (count);

}

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

int CountSell() 

{

   int count = 0;

   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

             count++;

      }

   }

   return (count);

}

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

int CountTrades()

{

   return(CountBuy() + CountSell()); 

}

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

double ND(double value)

{

   return (NormalizeDouble(value, Digits)); 

 
열거(열거형)에 몇 개의 요소가 있는지 확인하는 방법을 알려주십시오.
 
CJIeCaPb :

이전에 주문 OrderSelect(첫 번째 주문의 티켓, SELECT_BY_TICKET)를 선택했습니다.

if(OrderOpenPrice()+10*포인트==문의)

OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);

그리고 Ticket_of_the_first_order를 결정하는 방법은 무엇입니까?
 

IN MY WORK BRANCH ... 죄송합니다.

모두 굿나잇!!! 새해 복 많이 받으세요!

버퍼 데이터를 파일로 저장하기로 했습니다. 파일 생성 및 쓰기에는 특별한 문제는 없으나 읽기가 어렵습니다.

다음은 테스트 프로그램입니다. 도와주세요. 문제는 파일에 추가 쓰기가 있거나 파일 에서 읽지 않는다는 것입니다. 예를 들어 파일에서 배열로 목록을 읽고 싶습니다 ... 쓰기가 너무 게으르면 비슷한 자료에 대한 링크를 요청하지만 교과서 만 찾았습니다 ... BUT THE READY OPTION 사이트가 더 좋습니다))):

어떤 경우에도 미리 감사드립니다!!!)))):

 //+------------------------------------------------------------------+
//|                                                   Proba file.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
extern int ind= 0 ;   //--- выберем случайно номер строки
extern string СдвигДаты  = "30.12.2014  00:00" ;
extern bool    ВыключательСдвигаДаты = false ; 
extern bool    ЗаписьФайла = true ;
//--- глобальные переменные
int     Tm,hr,shift,shiftbar,size,InpFileName;
double H_buff[];
double L_buff[];
double C_buff[];
ulong   pos[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string   T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {  
//--- привязка массива к индикаторному буферу с номером индекса
   SetIndexBuffer ( 0 ,H_buff);
   SetIndexBuffer ( 1 ,L_buff);
   SetIndexBuffer ( 2 ,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
   SetIndexEmptyValue( 0 ,EMPTY);
   SetIndexEmptyValue( 1 ,EMPTY);
   SetIndexEmptyValue( 2 ,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle( 0 , DRAW_LINE , 0 , 1 );
   SetIndexStyle( 1 , DRAW_LINE , 0 , 1 );
   SetIndexStyle( 2 , DRAW_LINE , 1 , 1 );
//---- устанавить формат точности (количество знаков после десятичной точки
   IndicatorDigits( Digits );
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии 
   SetIndexDrawBegin( 0 , 2 );
//---
     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 (ВыключательСдвигаДаты== true ) 
    shiftbar  = iBarShift( Symbol (), PERIOD_D1 , StrToTime(СдвигДаты), false ); 
       else 
    shiftbar = 1 ; 
     hr=iBarShift( Symbol (), PERIOD_H1 ,iTime( Symbol (), PERIOD_D1 ,shiftbar));   // бервый бар дня для прорисовки уровней
     if (hr>= 8 )   shift= hr- 4 ;
    HIGH= iHigh( Symbol (), PERIOD_H1 ,shift);
    LOW=  iLow( Symbol (), PERIOD_H1 ,shift);
    CLOSE= iClose( Symbol (), PERIOD_H1 ,shift);
//----  Функция проверки баров утренней сессии
    
   int limit=iBarShift( Symbol (), 0 ,iTime( Symbol (), PERIOD_D1 ,shiftbar));   // бервый бар дня для прорисовки уровней
   int end=iBarShift( Symbol (), 0 ,iTime( Symbol (), PERIOD_D1 ,shiftbar- 1 ));

     if ( Period ()== PERIOD_H1 && hr>= 8 && (TimeDayOfWeek(Time[ 0 ])< 6 && TimeDayOfWeek(Time[ 0 ])> 0 ))
      {
   for ( int i=limit; i>=end; i--)
     {
     if (High[i+ 1 ]>LastHigh) LastHigh=High[i+ 1 ];
         if (Low[i+ 1 ]<LastLow) LastLow=Low[i+ 1 ];
         pr = TimeDay(Time[i]); 
      pr_1 = TimeDay(Time[i+ 1 ]);
     if (pr!=pr_1)
        {
         H_buff[i+ 1 ] = EMPTY;
         L_buff[i+ 1 ] = EMPTY;
         C_buff[i+ 1 ] = EMPTY;
        }
//----  Функция прорисовки уровней ZigZag на графике
         H_buff[i]=HIGH;
         L_buff[i]=LOW;
         C_buff[i]=CLOSE;
        }
       }
////////////////////////////////////////////////      ЭТО  БЫЛО   ВСТУПЛЕНИЕ   ДЛЯ   РАБОЧЕГО   ПОНИМАНИЯ    \\\\\\\\\\\\\\\\\\ 
   
//-----  Функция открытия и чтения значений из файла  
       ResetLastError ();
//--- откроем файл
       if (ЗаписьФайла== true )
      InpFileName= FileOpen ( Symbol ()+ " Z Point.txt" , FILE_READ | FILE_TXT );
   if (InpFileName!= INVALID_HANDLE )
     {
      GetStringPositions(InpFileName,pos);                     //--- получим позицию начала для каждой строки в файле
      size= ArraySize (pos);                                     //--- определим сколько всего строк в файле   
       if (!size)                                               //--- если в файле нет строк, то завершаем работу
     FileClose (InpFileName);

       if ( FileSeek (InpFileName,pos[ind], SEEK_SET )== true )       //--- сдвинем позицию на начало этой строки
        {
       Print ( "Текст строки с номером    " ,ind, "   " , FileReadString (InpFileName), "  size  " ,size);   //--- прочитаем и распечатаем строку с номером ind
      file_buffer= FileReadString (InpFileName);     // чтение строки из файла
      T1= StringSubstr (file_buffer, 0 , 2 + Digits );     // Извлекаем первые 7 символов
      T2= StringSubstr (file_buffer, 7 , 2 + Digits );     // Извлекаем вторые 7 символов
      T3= StringSubstr (file_buffer, 14 , 2 + Digits );   // Извлекаем третьи 7 символов
      T4= StringSubstr (file_buffer, 21 );             // Извлекаем остаток символов
        }
       FileClose (InpFileName);
     }
   
       if (ЗаписьФайла== true ) {
       Comment ( "ЗАПИСЬ  В ФАЙЛ: IND " ,ind, "  SIZE  " ,size, "  T1:  " ,StrToDouble(T1), " ||| T2:  " ,StrToDouble(T2), " ||| T3:   " ,StrToDouble(T3), "  |||  shift  " ,StrToInteger(T4));   
        
         if (StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)
        WRITEfile(); } else Comment ( "ЗАПИСЬ  ВЫКЛЮЧЕНА !" );

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions( const int handle, ulong &arr[])
  {
  
   int i,def_size= 127 ;           //--- размер массива по умолчанию
   ArrayResize (arr,def_size);     //--- выделим память для массива
   if (! FileIsEnding (handle))     //--- если не конец файла, то есть хотя бы одна строка
     {
      arr[i]= FileTell (handle);
      i++;                       //--- счетчик строк
     }
   else
       return ;                       // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   
   if ( FileGetInteger (handle, FILE_IS_TEXT ))
   while (! FileIsEnding (handle))   //--- в цикле перебираем строки до конца файла
     {
       FileReadString (handle);     //--- читаем строку
       if (! FileIsEnding (handle))   //--- проверка на конец файла
        {
         arr[i]= FileTell (handle)+ 1 ;   //--- запомним позицию следующей строки
         i++;
         if (i==def_size)         //--- увеличим размер массива, если он переполнен
           {
            def_size+=def_size+ 1 ;
             ArrayResize (arr,def_size);
           }
        }
       else
         break ;               // конец файла, выходим
     }
   ArrayResize (arr,i);     //--- установим истинный размер массива
  } 
//+------------------------------------------------------------------+
void WRITEfile()   // запись в файл и его создание если его нет
  { 
//--- сбросим код ошибки
   ResetLastError ();
//--- правильный способ работы в "файловой песочнице"
   InpFileName= FileOpen ( Symbol ()+ " Z Point.txt" , FILE_READ | FILE_WRITE | FILE_TXT );   // Имя файла
   if (InpFileName!= INVALID_HANDLE )
     {
   FileSeek (InpFileName, 0 , SEEK_END );
   FileWrite (InpFileName,DoubleToStr(HIGH, Digits ),DoubleToStr(LOW, Digits ),DoubleToStr(CLOSE, Digits ), IntegerToString (shift, 0 ));
     FileFlush (InpFileName);  
     }
   FileClose (InpFileName);           
   return ;
  }
//+------------------------------------------------------------------+
 

아아, 파일에 레코드가 있으면 모든 것이 그렇게 간단하지는 않습니다 !!! (((

그러나 그것은 ... 반대인 것 같았습니다.

훈련 예제 덕분에 읽기는 했지만 파일에 쓰기 위해서는 더 복잡한 코드가 필요합니다. 더 빨리 속은 것은 이미 ... 그리고 파일에서 읽기 조정으로 레코드를 이동하는 방법은 생각하지 않을 것입니다.

요일 표시줄 및 기록(초기 버퍼 데이터)에 대한 고정 설정 수준.

질문은 동일합니다. 쓰기가 많은 경우 버퍼 데이터를 파일에 쓰는 것이 더 나은 방법에 대해 힌트를 주세요.

수정된 프로그램 코드

 //+------------------------------------------------------------------+
//|                                                   Proba file.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
extern int ind= 0 ;   //--- выберем случайно номер строки
extern string СдвигДаты  = "06.01.2015  00:00" ;
extern bool    ВыключательСдвигаДаты = false ; 
extern bool    ЗаписьФайла = true ;
//--- глобальные переменные
int     Tm,hr,shift,shiftbar,size,sizew,InpFileName,limit,end;
double H_buff[];
double L_buff[];
double C_buff[];
ulong   pos[],arrw[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string   T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {  
//--- привязка массива к индикаторному буферу с номером индекса
   SetIndexBuffer ( 0 ,H_buff);
   SetIndexBuffer ( 1 ,L_buff);
   SetIndexBuffer ( 2 ,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
   SetIndexEmptyValue( 0 ,EMPTY);
   SetIndexEmptyValue( 1 ,EMPTY);
   SetIndexEmptyValue( 2 ,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
   SetIndexStyle( 0 , DRAW_LINE , 0 , 1 );
   SetIndexStyle( 1 , DRAW_LINE , 0 , 1 );
   SetIndexStyle( 2 , DRAW_LINE , 1 , 1 );
//---- устанавить формат точности (количество знаков после десятичной точки
   IndicatorDigits( Digits );
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии 
   SetIndexDrawBegin( 0 , 2 );
//---
     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 (ВыключательСдвигаДаты== true ) 
    shiftbar  = iBarShift( Symbol (), PERIOD_D1 , StrToTime(СдвигДаты), false ); 
       else 
    shiftbar = 0 ; 
     hr=iBarShift( Symbol (), PERIOD_H1 ,iTime( Symbol (), PERIOD_D1 ,shiftbar));   // бервый бар дня для прорисовки уровней
     if (hr>= 9 )   shift= hr- 8 ;
    HIGH= iHigh( Symbol (), PERIOD_H1 ,shift);
    LOW=  iLow( Symbol (), PERIOD_H1 ,shift);
    CLOSE= iClose( Symbol (), PERIOD_H1 ,shift);
//----  Функция проверки баров утренней сессии
    
     if (ВыключательСдвигаДаты== true ) 
     {
       limit=shift;
       end=iBarShift( Symbol (), 0 ,iTime( Symbol (), PERIOD_D1 ,shiftbar))- 23 ;
       }
         else 
       {
       limit=shift;
       end=iBarShift( Symbol (), 0 ,iTime( Symbol (), PERIOD_D1 ,shiftbar))-hr;
        }
     if ( Period ()== PERIOD_H1 && hr>= 8 && (TimeDayOfWeek(Time[ 0 ])< 6 && TimeDayOfWeek(Time[ 0 ])> 0 ))
      {
   for ( int u=limit; u>=end; u--)
     {
     if (High[u+ 1 ]>LastHigh) LastHigh=High[u+ 1 ];
         if (Low[u+ 1 ]<LastLow) LastLow=Low[u+ 1 ];
         pr = TimeDay(Time[u]); 
      pr_1 = TimeDay(Time[u+ 1 ]);
     if (pr!=pr_1)
        {
         H_buff[u+ 1 ] = EMPTY;
         L_buff[u+ 1 ] = EMPTY;
         C_buff[u+ 1 ] = EMPTY;
        }
//----  Функция прорисовки уровней  на графике
         H_buff[u]=HIGH;
         L_buff[u]=LOW;
         C_buff[u]=CLOSE;
        }
       }
/////////////////////////////////////////////////////////////////////////  
   
//-----  Функция открытия и чтения значений из файла  
       ResetLastError ();
//--- откроем файл
       if (ЗаписьФайла== true )
      InpFileName= FileOpen ( Symbol ()+ " Z Point.txt" , FILE_READ | FILE_TXT );
   if (InpFileName!= INVALID_HANDLE )
     {
      GetStringPositions(InpFileName,pos);                     //--- получим позицию начала для каждой строки в файле
      size= ArraySize (pos);                                     //--- определим сколько всего строк в файле   
       if (!size)                                               //--- если в файле нет строк, то завершаем работу
     FileClose (InpFileName);

       if ( FileSeek (InpFileName,pos[ind], SEEK_SET )== true )       //--- сдвинем позицию на начало этой строки
        {
       Print ( "Текст строки с номером " ,ind, "  " , FileReadString (InpFileName), " size  " ,size);   //--- прочитаем и распечатаем строку с номером ind
      file_buffer= FileReadString (InpFileName);     // чтение строки из файла
      T1= StringSubstr (file_buffer, 0 , 2 + Digits );     // Извлекаем первые 7 символов
      T2= StringSubstr (file_buffer, 7 , 2 + Digits );     // Извлекаем вторые 7 символов
      T3= StringSubstr (file_buffer, 14 , 2 + Digits );   // Извлекаем третьи 7 символов
      T4= StringSubstr (file_buffer, 21 );             // Извлекаем остаток символов
        }
       FileClose (InpFileName);
     }
         if (ЗаписьФайла== true ) {
         Comment ( "ЗАПИСЬ  В ФАЙЛ: IND " ,ind, "  SIZE  " ,size, "  T1:  " ,StrToDouble(T1), " ||| T2:  " ,StrToDouble(T2), " ||| T3:   " ,StrToDouble(T3), "  |||  shift  " ,StrToInteger(T4));   
          
   if (StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)  
      WRITEfile(); } else 
     Comment ( "ЗАПИСЬ  ВЫКЛЮЧЕНА !" );

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions( const int handle, ulong &arr[])
  {  
   int j,def_size= 127 ;           //--- размер массива по умолчанию
   ArrayResize (arr,def_size);     //--- выделим память для массива
   if (! FileIsEnding (handle))     //--- если не конец файла, то есть хотя бы одна строка
     {
      arr[j]= FileTell (handle);
      j+= 1 ;                       //--- счетчик строк
     }
   else
       return ;                       // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   
   //if(FileGetInteger(handle,FILE_IS_TEXT))
   while (! FileIsEnding (handle))   //--- в цикле перебираем строки до конца файла
     {
       FileReadString (handle);     //--- читаем строку
       if (! FileIsEnding (handle))   //--- проверка на конец файла
        {
         arr[j]= FileTell (handle)+ 1 ;   //--- запомним позицию следующей строки
         j+= 1 ;
         if (j==def_size)         //--- увеличим размер массива, если он переполнен
           {
            def_size+=def_size+ 1 ;
             ArrayResize (arr,def_size);
           }
        }
       else
         break ;               // конец файла, выходим
     }
   ArrayResize (arr,j);     //--- установим истинный размер массива
  } 
//+------------------------------------------------------------------+
void WRITEfile()   // запись в файл и его создание если его нет
  { 
  InpFileName= FileOpen ( Symbol ()+ " Z Point.txt" , FILE_WRITE | FILE_TXT );
   if (InpFileName!= INVALID_HANDLE )
     {   
     FileWrite (InpFileName, "Начало файловой записи.Проба" );
   while (! FileIsEnding (InpFileName))   //--- в цикле перебираем строки до конца файла
     FileReadString (InpFileName);     //--- читаем строку
     FileSeek (InpFileName, 0 , SEEK_END );   // конец файла, пишем
   FileWrite (InpFileName,DoubleToStr(HIGH, Digits ),DoubleToStr(LOW, Digits ),DoubleToStr(CLOSE, Digits ), IntegerToString (shift, 0 ));
     FileFlush (InpFileName);      
        } 
     FileClose (InpFileName); 
   }   
//+------------------------------------------------------------------+
 

내 질문에 대한 답변을 검색할 수 있는 곳을 찾았습니다... 파일 작업 정보))):

파일에서 차트로 정보 를 표시하기 위한 스크립트.

무료 MT4 코드의 역사 데이터를 파일로 전송하는 옵션과 반대 작업이 있습니다.

모두 감사합니다, 모든 차오))))):

 

날짜가 "20141231" 형식인 대용량 파일이 있습니다. 문자열을 날짜/시간 형식으로 변환하려면 연도, 월, 날짜 사이에 "YYYY.MM.DD" 점이 필요합니다.

어떻게 할 수 있습니까?

 
안녕하세요 여러분, 저는 고문이 100개 막대에 대한 최고 또는 최저 최저값을 찾기를 원합니다. 어디에서 무엇을 읽을지 알려주세요.
 
zhezheria :
안녕하세요 여러분, 저는 고문이 100개 막대에 대한 최고 또는 최저 최저값을 찾기를 원합니다. 어디에서 무엇을 읽을지 알려주세요.

도움말을 읽을 수 있으며 모든 것이 예제와 함께 있습니다.

High[iHighest( NULL , 0 ,MODE_HIGH, 100 , 0 ]

Low[iLowest( NULL , 0 ,MODE_LOW, 100 , 0 ]