FANN2MQL для MQL5

 

Я использовал либу FANN2MQL в MQL4, всё работало под WinXP и Win7. Теперь пытаюсь использовать её в MQL5. Обучение происходит, но функция ann_save() не сохраняет файл в заданный путь. Ни в C:\\ANN\\, ни в TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\"

В то же время функция возвращает 0, т.е. "нет ошибки".

OS Windows 7. Права доступа к путям полные.

Кто перекрывает доступ к файлам, MT5 или Win7? И что делать?

 
Dali:

Я использовал либу FANN2MQL в MQL4, всё работало под WinXP и Win7. Теперь пытаюсь использовать её в MQL5. Обучение происходит, но функция ann_save() не сохраняет файл в заданный путь. Ни в C:\\ANN\\, ни в TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\"

В то же время функция возвращает 0, т.е. "нет ошибки".

OS Windows 7. Права доступа к путям полные.

Кто перекрывает доступ к файлам, MT5 или Win7? И что делать?

Привет. У меня та же проблема. Оказалось, что оно сохраняет сеть в папку с терминалом(в програм файлс, рядом с терминал.ехе). Выкладываю свои наработки по теме, может кому-то интересно будет.
Файлы:
fann2.mq5  12 kb
 

Об ошибке функция всё-же сообщает, я был неправ.

А проблема оказалась в следующем - Fann2MQL.dll под MT5/Win7 получает не строку пути, а её первый символ. И когда я передаю "C:\\ANN\\0.net", она получает "C" и сохраняет файл "C" в дефолтную папку "C:\Program Files\MetaTrader 5\", если установить на эту папку достаточные права (по умолчанию их нет).

Похоже, дело в этом:

FANN2MQL_API int __stdcall f2M_save(int ann, char *path)
и для FANN2MQL/MT5 надо что-то переделать в исходниках.

 
Dali:
и для FANN2MQL/MT5 надо что-то переделать в исходниках.
Да, учесть юникодность МТ5.
 
 
Спасибо, помогло.

 

Кто как конвертирует текст? Я нашел 2 ф-и:

string ANSI2UNICODE(string s)
  {
   ushort mychar;
   long m,d;
   double mm,dd;
   string img;    
   string res="";
   if (StringLen(s)>0)
     {
      string g=" ";
      for (int i=0;i<StringLen(s);i++)
         {          
          string f="  ";          
          mychar=ushort(StringGetCharacter(s,i));
          mm=MathMod(mychar,256);
          img=DoubleToString(mm,0);
          m=StringToInteger(img);
          dd=(mychar-m)/256;
          img=DoubleToString(dd,0);
          d=StringToInteger(img);
          if (m!=0)
            {
             StringSetCharacter(f,0,ushort(m));
             StringSetCharacter(f,1,ushort(d));
             StringConcatenate(res,res,f);
            }//if (m!=0)
          else
            break;                      
         }//for (int i=0;i<StringLen(s);i++)
      }//if (StringLen(s)>0)
   return(res);
  }
 
string UNICODE2ANSI(string s)
  {
   int leng,ipos;
   uchar m,d;
   ulong big;
   leng=StringLen(s);
   string unichar;
   string res="";
   if (leng!=0)
     {    
      unichar=" ";
      ipos=0;      
      while (ipos<leng)
        { //uchar typecasted because each double byte char is actually one byte
         m=uchar(StringGetCharacter(s,ipos));
         if (ipos+1<leng)
           d=uchar(StringGetCharacter(s,ipos+1));
         else
           d=0;
         big=d*256+m;                
         StringSetCharacter(unichar,0,ushort(big));         
         StringConcatenate(res,res,unichar);    
         ipos=ipos+2;
        }
     }
   return(res);
  }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string original_unicode,ansi,converted_unicode;
   original_unicode="EvenString";
   ansi=UNICODE2ANSI(original_unicode);
   converted_unicode=ANSI2UNICODE(ansi);
   Print(original_unicode," -> ",ansi," -> ",converted_unicode);
   original_unicode="OddString";
   ansi=UNICODE2ANSI(original_unicode);
   converted_unicode=ANSI2UNICODE(ansi);
   Print(original_unicode," -> ",ansi," -> ",converted_unicode);
  }

 У кого-то есть лучше решение?

 

Посмотрите штатные функции преобразования строк:

Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов.

int  StringToCharArray(
   string  text_string,         // строка-источник
   uchar&  array[],             // массив
   int     start=0,             // начальная позиция в массиве
   int     count=-1             // количество символов
   uint    codepage=CP_ACP      // кодовая страница
   );


Копирует и преобразует часть массива типа uchar в возвращаемую строку.

string  CharArrayToString(
   uchar   array[],             // массив
   int     start=0,             // начальная позиция в массиве
   int     count=-1             // количество символов
   uint    codepage=CP_ACP      // кодовая страница
   );

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
bool
ann_save(int ann, string path) {
    uchar p[];
    StringToCharArray(path, p);
    if (f2M_save(ann, p) < 0) {
        ОБРАБОТКА ОШИБКИ
        return (false);
    }
    return (true);
}
 
Dali:

Ваш код не работает(ошибка при компиляции). Правильно работает, только с ф-яим, приведенными мною выше.

Написал свою ф-ю:

void ann_save(int ann,string path)
  {
   uchar t[];
//string text="dfkjlkjdshfgjksdhfgklsdjhfgksj";
   StringToCharArray(path,t);
//Comment(CharArrayToString(t,0,WHOLE_ARRAY,CP_OEMCP));
   Print(CharArrayToString(t,0,WHOLE_ARRAY,CP_ACP));
   Print("f2M_save("+IntegerToString(ann)+", "+path+") returned: "+IntegerToString(f2M_save(ann,CharArrayToString(t,0,WHOLE_ARRAY,CP_ACP))));
  }

В логах пишет:

Но сеть все равно сохраняется в папке с терминалом. Что я делаю не так? 

 
Graff:

Ваш код не работает(ошибка при компиляции). Правильно работает, только с ф-яим, приведенными мною выше.

Написал свою ф-ю:

В логах пишет:

Но сеть все равно сохраняется в папке с терминалом. Что я делаю не так? 

В заголовочном файле Fann2MQL.mqh измени:

int f2M_save(int ann, string path[]);

на:

int f2M_save(int ann, uchar &path[]);

и пользуйся:

bool ann_save(int ann, string path) {
    uchar p[];
    StringToCharArray(path, p);
    if (f2M_save(ann, p) < 0) {
        return (false);
    }
    return (true);
}
:))