разница между Metatrader CSV и C# StreamWriter CSV. Как это решить?

У меня есть код в Metatrader, который записывает некоторые котировки в CSV, но при этом в C# советник читает значения по-другому... Этот код в MetaEditor записывает CSV-файл:

li_40 = FileOpen(ls_32, FILE_CSV|FILE_WRITE|FILE_SHARE_READ, ";");
      if (li_40 > 0) {
         FileWrite(li_40, ls_16);
         FileClose(li_40);

Это пишет на С#:

            List<string> listB = new List<string>();
            using (StreamReader reader = new StreamReader(File.OpenRead(oFile)))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    listB.Add(reader.ReadLine());
                }
                reader.Close();
            }
            using (StreamWriter swOut = new StreamWriter(oFile))
            {

                foreach (var item in listB)
                {
                    swOut.Write(item);
                    swOut.Write(Environment.NewLine);
                }
                for (int i = 0; i <= gridIn.Columns.Count - 1; i++)
                {
                    if (i > 0)
                    {
                        swOut.Write(", ");
                    }

                    value = dr.Cells[i].Value.ToString();
                    string vals = dr.Cells[2].Value.ToString();
                                           int priceDecimalPlaces = vals.Split('.').Count() > 1
                                  ? vals.Split('.').ToList().ElementAt(1).Length
                                  : 0;
                                            string nell = "0";
                                            if (priceDecimalPlaces == 3)
                                            {
                                                nell = "0.001";
                                            }
                                            if (priceDecimalPlaces == 5)
                                            {
                                                nell = "0.00001";
                                            }
                                            if (priceDecimalPlaces == 4)
                                            {
                                                nell = "0.0001";
                                            }

                    //replace comma's with spaces
                    value = value.Replace(',', ' ');
                    //replace embedded newlines with spaces
                    value = value.Replace(Environment.NewLine, "");

Если разница между C# double и текущим значением double в MetaTrader составляет 0.12098-0.12096=2, Metatrader увидит значение не как 2, а как нечто гораздо большее, например 18,17 и т. д., но запись того же значения из кода MetaTrader дает правильное значение. ценность...

Я прочитал CSV, используя _lread:

     uchar chBuff[1024];
     int res = _lread(hFile, chBuff, 1);
     //
     //CreateFileA(
     res = _lread(hFile, chBuff, 350);
     ls_308 = CharArrayToString(chBuff, 0, res, CP_UTF8);
  //Alert(Ls_84);
     ls_308=StringSubstr(ls_308,0,StringFind(ls_308,"\r\n",0));   

     if (_lclose(hFile)<0) Print("Error closing");

Я думаю, что есть некоторая разница между двойниками С# в Metatrader и обычными двойниками Metatrader.


person Niyi Mark    schedule 14.10.2015    source источник


Ответы (1)


Ошибка была вызвана тем, что язык кодировки Системы отличался от UTF-8, указанного в коде Metatrader.

ls_308 = CharArrayToString(chBuff, 0, res, CP_UTF8);

Итак, я изменил UTF на всю кодовую страницу, назначенную системой, сделав это

ls_308 = CharArrayToString(chBuff, 0, res, CP_ACP);

Надеюсь, кто-то найдет это полезным ..

person Niyi Mark    schedule 16.10.2015