ReadVProfile

Скрипт MQL для чтения вертикального профиля из CSV. Предполагается что первые два поля каждой записи «цена;объём».

ReadVProfile
//+------------------------------------------------------------------+
//|                                                 ReadVProfile.mq4 |
//|                                                Maxim A.Kuznetsov |
//|                                                      luxtrade.tk |
//+------------------------------------------------------------------+
#property copyright "Maxim A.Kuznetsov"
#property link      "luxtrade.tk"
#property version   "1.00"
#property strict
#property script_show_inputs
 
/*** чтение вертикального профиля рынка из CSV
***/
 
sinput string   fileName="profile.csv";
sinput datetime dateFrom=0;
sinput datetime dateTo=0;
sinput bool     CLEAR=false;
double minPrice=DBL_MAX;
double maxPrice=DBL_MIN;
long maxVolume=LONG_MIN;
 
void OnStart()
{
   ObjectsDeleteAll(0,"profile_");
   if (CLEAR) {
      return;
   }
   /// первый проход - вычислить макс.объём для масштабирования
   int f;
   f=FileOpen(fileName,FILE_READ|FILE_CSV,';');
   if (f==INVALID_HANDLE) {
      Alert("Ошибка при открытии файла");
      return;
   }   
   while ( ! FileIsEnding(f) ) {
      double price=StrToDouble(FileReadString(f));
      long volume=StrToInteger(FileReadString(f));
      while(!FileIsLineEnding(f)) {
         FileReadString(f);
      }
      if (volume>maxVolume) maxVolume=volume;
      if (price<minPrice) minPrice=price;
      if (price>maxPrice) maxPrice=price;
   }
   /// второй проход - рисование гор.линий
   // от дата=начало пред.недели масштаб=
   datetime from=iTime(_Symbol,PERIOD_W1,1);
   if (dateFrom!=0 && dateFrom<TimeCurrent()) from=dateFrom;
   datetime to=TimeCurrent();
   if (dateTo!=0 && dateTo>dateFrom && dateTo<TimeCurrent()) to=dateTo;
   double scale=(double)(to - from)/(double)maxVolume;
 
   FileSeek(f,0,SEEK_SET);
   while ( ! FileIsEnding(f) ) {
      double price=StrToDouble(FileReadString(f));
      long volume=StrToInteger(FileReadString(f));
      while(!FileIsLineEnding(f)) {
         FileReadString(f);
      }
      string name="profile_"+DoubleToStr(price,_Digits);
      if (ObjectCreate(0,name,OBJ_TREND,0,0,0)||ObjectType(name)==OBJ_TREND) {
         ObjectSetInteger(0,name,OBJPROP_TIME1,from);
         ObjectSetInteger(0,name,OBJPROP_TIME2,from+(long)(volume*scale));
         ObjectSetDouble(0,name,OBJPROP_PRICE1,price);
         ObjectSetDouble(0,name,OBJPROP_PRICE2,price);
         ObjectSetInteger(0,name,OBJPROP_RAY,false);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
         ObjectSetInteger(0,name,OBJPROP_BACK,true);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
      }
   }
   FileClose(f);   
}