Бета-тестирование MetaTrader 5 началось! - страница 99

 
Interesting >>:


На сколько я помню String и PChar совместимые типы (по крайней мере в Delphi).


Привожу таблицу совмещения типов данных Delphi и C++ (взятую из справки Борланда)

Delphi Size/Values C++ Implementation
ShortInt 8-bit integer signed char typedef
SmallInt 16-bit integer short typedef
LongInt 32-bit integer int typedef
Byte 8-bit unsigned integer unsigned char typedef
Word 16-bit unsigned integer unsigned short typedef
Integer 32-bit integer int typedef
Cardinal 32-bit unsigned integer unsigned int typedef
Boolean true/false bool typedef
ByteBool true/false or 8-bit unsigned integer unsigned char typedef
WordBool true/false or 16-bit unsigned integer unsigned short typedef




LongBool true/false or 32-bit unsigned integer BOOL (WinAPI) typedef
AnsiChar 8-bit unsigned character char typedef
WideChar word-sized Unicode character wchar_t typedef
Char 8-bit unsigned character char typedef
AnsiString Delphi AnsiString AnsiString class
String[n] old style Delphi string, n = 1..255 bytes SmallString<n> template class
ShortString old style Delphi string, 255 bytes SmallString<255> typedef
String Delphi AnsiString AnsiString typedef




Single 32-bit floating point number float typedef
Double 64-bit floating point number double typedef
Extended 80-bit floating point number long double typedef
Real 32-bit floating point number double typedef
Pointer 32-bit generic pointer void * typedef
PChar 32-bit pointer to characters unsigned char * typedef
PAnsiChar 32-bit pointer to ANSI characters unsigned char * typedef
Comp 64-bit floating point number Comp class
OleVariant OLE variant value OleVariant class

Если пишете принципиально на delphi7 то PWideChar Вам в помошь если среда разработки не так принципиально то в delphi 2009 строки по умолчанию unicode

http://www.citforum.ru/programming/delphi/unicode/1.shtml

 

Вопрос разработчикам:

как избавится то этого эфекта?

Пример кода который использую, выход стохастика за 80 и 20, с 20 проблем нет хотя тоже смноится не ровным отсечением а /===\ ну да ладно, а вот с 80 проблем.

//+------------------------------------------------------------------+
//|                                           Enthios Stochastic.mq5 |
//|                                                Copyright VDVSoft |
//|                                                 vdv_2001@mail.ru |
//+------------------------------------------------------------------+
#property copyright "VDVSoft"
#property link      "vdv_2001@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   3
//---- plot FastStoch
#property indicator_label1  "FastStoch"
#property indicator_type1   DRAW_COLOR_HISTOGRAM2
#property indicator_color1  Red,Green
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//---- plot SlowStoch
#property indicator_label2  "SlowStoch"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Blue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//---- plot CriticalRange
#property indicator_label3  "CriticalRange"
#property indicator_type3   DRAW_FILLING
#property indicator_color3  MistyRose,Lavender
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---- plot CriticalRangeDown
//--- input parameters
input int      FastK_period=9;
input int      FastD_period=3;
input int      SlowK_period=81;
input int      SlowD_period=27;
//--- indicator buffers
double         FastStochBuffer1[];
double         FastStochBuffer2[];
double         FastStochColors[];
double         SlowStochBuffer[];
double         CriticalRangeBuffer1[];
double         CriticalRangeBuffer2[];
// indicators handles
int            FastStochHandles;
int            SlowStochHandles;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,FastStochBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,FastStochBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,FastStochColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,SlowStochBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,CriticalRangeBuffer1,INDICATOR_DATA);
   SetIndexBuffer(5,CriticalRangeBuffer2,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"Enthios Stoch("+(string)FastK_period+","+(string)FastD_period+" | "+(string)SlowK_period+","+(string)SlowD_period+")");
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,0.0);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,FastK_period+FastD_period-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,FastK_period+FastD_period);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,SlowK_period+SlowD_period-2);
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,SlowK_period+SlowD_period-2);
   PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,SlowK_period+SlowD_period-2);
   
//--- indicators handles
   FastStochHandles=iStochastic(NULL,0,FastK_period,FastD_period,FastD_period,MODE_SMA,STO_LOWHIGH);
   SlowStochHandles=iStochastic(NULL,0,SlowK_period,SlowD_period,SlowD_period,MODE_SMA,STO_LOWHIGH);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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& TickVolume[],
                const long& Volume[],
                const int& Spread[])
{
//---
   int start;
   if(BarsCalculated(FastStochHandles)<rates_total||BarsCalculated(SlowStochHandles)<rates_total)
   {
      Print("Not all data of iStochastic is calculated. Error",GetLastError());
      return(0);
   }
   if(CopyBuffer(FastStochHandles,0,0,rates_total,FastStochBuffer1)<=0||
      CopyBuffer(FastStochHandles,1,0,rates_total,FastStochBuffer2)<=0||
      CopyBuffer(SlowStochHandles,0,0,rates_total,SlowStochBuffer)<=0 )
   {
      Print("Getting iStochastic data is failed! Error",GetLastError());
      return(0);
   }
   start=SlowK_period-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   if(prev_calculated==0)
   {
      ArrayInitialize(CriticalRangeBuffer1, 0.0);
      ArrayInitialize(CriticalRangeBuffer2, 0.0);
   }

   for(int i=start;i<rates_total;i++)
   {
      if(FastStochBuffer1[i]<FastStochBuffer2[i])
         FastStochColors[i]=0.0;
      else
         FastStochColors[i]=1.0;
         
      if(SlowStochBuffer[i]>=80)
      {
         CriticalRangeBuffer1[i]=99.9;
         CriticalRangeBuffer2[i]=80.0;
      }
      else
         if(SlowStochBuffer[i]<=20)
         {
            CriticalRangeBuffer1[i]=0.01;
            CriticalRangeBuffer2[i]=20.0;
         }
         else
         {
            CriticalRangeBuffer1[i]=0.0;
            CriticalRangeBuffer2[i]=0.0;
         }
   }
   
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

Подскажите как от этого избавится!!!

 

Уважаемые разработчики, откройте секрет при помощи чего компилировался пример DLL для MT4.


Перепробовал почти весь арсенал который у меня на компе стоит (только Delphi 2009 осталось испробовать), не удается корректно передать/получить обычную строку из DLL.


Если можно обновите плиз пример для MT5.

Желательно еще пополнить типы данных отвечающие за строки (ну иди каким-то образом дать возможность переделывать ANSI в Unicode и обратно).


PS

Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.

А в набор функций работы с тексом добавить две функции UnicodeToString и StringToUnicode.

 
Interesting >>:

PS

Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.

А в набор функций работы с текстом добавить две функции UnicodeToString и StringToUnicode.

При помощи Borland C++ Builder 6 я всеж смог создать пример для DLL (там кстати возвращается char* - что как я понял из таблицы должно соответствовать PChar).


PS

Хотя код только реализует нормальный возврат переданной из терминала строки (старый пример для MT4)

Желательно как я уже написал выше добавить в терминал две функции по преобразованию ANSI в Unicode.

А как наилучшее решение проблемы немного поправить типы данных (за основу для новых типов можно взять ту таблицу что приводилось мной выше)
Файлы:
 
Interesting писал(а) >>

Уважаемые разработчики, откройте секрет при помощи чего компилировался пример DLL для MT4.

Перепробовал почти весь арсенал который у меня на компе стоит (только Delphi 2009 осталось испробовать), не удается корректно передать/получить обычную строку из DLL.

Если можно обновите плиз пример для MT5.

Желательно еще пополнить типы данных отвечающие за строки (ну иди каким-то образом дать возможность переделывать ANSI в Unicode и обратно).

PS

Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.

А в набор функций работы с тексом добавить две функции UnicodeToString и StringToUnicode.

1. Ещё раз. В MQL5 используются юникодные строки. Читайте справку по MQL5 - там подробно описывается формат

2. DLL для MT4 ничем не отличаются от DLL для MT5. Опять же читайте справку.

PS. Чтобы возвращать строку из функции, нужно обладать высокой квалификацией программиста. Программист высокой квалификации не станет возвращать из функции ничего, кроме элементарных типов (string, как и указатели на память, не является элементарным типом). Все остальные типы, при необходимости, должны возвращаться в параметре функции типа [out], переданногопо ссылке. Если хотите таким (правильным) образом возвратить строку, опять же читайте справку про тип string в MQL5 и почитайте кроме того, как это делается в Windows API

 
stringo >>:

1. Ещё раз. В MQL5 используются юникодные строки. Читайте справку по MQL5 - там подробно описывается формат

2. DLL для MT4 ничем не отличаются от DLL для MT5. Опять же читайте справку.

PS. Чтобы возвращать строку из функции, нужно обладать высокой квалификацией программиста. Программист высокой квалификации не станет возвращать из функции ничего, кроме элементарных типов (string, как и указатели на память, не является элементарным типом). Все остальные типы, при необходимости, должны возвращаться в параметре функции типа [out], переданногопо ссылке. Если хотите таким (правильным) образом возвратить строку, опять же читайте справку про тип string в MQL5 и почитайте кроме того, как это делается в Windows API


Да справку я читал, и еще кучу всего про Юникодину, не очень мне это подходит.

На мой взгляд будет проще все реализовать на уровне терминала (это позволит не привязываться к системам с помощью которых создавались DLL).


На счет DLL для MT4 и MT5 не знаю, но видимо если рассматривать старый пример то они будут схожими (вопрос был чисто технический, поскольку были определенные трудности при работе с MS VC 6, да и размер файла меня не порадовал. В отличии от того что в примере у меня выщло 200 Кб).

Насколько я понимаю работа по API для MQL5 еще не начата, в противном случае компилятор не стал вырубать терминал и материться при любой ошибке.


На счет WinAPI: я привык к работе без Unicode, но код работает при этом без проблем.

Не знаю как это реализовано на MS С++ (тем более при условии юникодности), но вот пример вызова функций WinAPI:

//$EXTERNALSYM SearchPath
function SearchPath(lpPath, lpFileName, lpExtension:PChar;
nBufferLength:DWORD; lpBuffer:PChar; var lpFilePart:PChar):DWORD; stdcall;

//$EXTERNALSYM SearchPathW
function CopyFile(lpExistingFileName, lpNewFileName:PChar; bFailIfExists:BOOL):BOOL; stdcall;

//$EXTERNALSYM CopyFileA
function CopyFileA(lpExistingFileName, lpNewFileName: PAnsiChar; bFailIfExists: BOOL): BOOL; stdcall;

//$EXTERNALSYM CopyFileW
function CopyFileW(lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL): BOOL; stdcall;


Как видно для общения с Win XP вполне хватает и PChar (в C++ char*. Насколько я понял в MQL этот тип не присутсвует к сожалению), PAnsiChar и PWindeChar


PS

Конечно можно общаться с DLL "правильно" и профеесионально, только при при помощи стандартных типов данных (я про bool, int и double), но хочется чего-то более сложного.

 
А в МТ5 не существует возможности заключения части кода в раскрывающийся блок как в C++?
 

Тут один вопросик возник - а что должна возвращать строка AccountInfoInteger(ACCOUNT_TRADE_MODE)?


Судя по справке возвращать нужно ENUM_ACCOUNT_TRADE_MODE


ENUM_ACCOUNT_TRADE_MODE

Идентификатор

Описание

ACCOUNT_TRADE_MODE_DEMO

Демонстрационный торговый счет

ACCOUNT_TRADE_MODE_CONTEST

Конкурсный торговый счет

ACCOUNT_TRADE_MODE_REAL

Реальный торговый счет


Компилятор вот такое предупреждение выдает "conversion possible loss of data". Это нормально?

 

билды с 215 по 217

В компиляторе ошибка при расчёте индексов, в случае если содержится умножение внутри квадратных скобок.

Программа компиляется без проблем, однако работает с проблемами // Array out of range ..................

В аттаче полная версия индикатора.

       double sum=0;
       ...
       ...
       if (Test)
         sum += price[i+j*asStep]*c*sign;  // не работает или (иногда) работает но неправильно ;)
       else
        {
         long idx=i+j*asStep;              //  работает как надо
         sum += price[idx]*c*sign;         //  работает как надо 
        }
Файлы:
altsign.rar  7 kb
 
Interesting писал(а) >>

...

Не знаю как это реализовано на MS С++ (тем более при условии юникодности), но вот пример вызова функций WinAPI:

//$EXTERNALSYM SearchPath
function SearchPath(lpPath, lpFileName, lpExtension:PChar;
nBufferLength:DWORD; lpBuffer:PChar; var lpFilePart:PChar):DWORD; stdcall;

//$EXTERNALSYM SearchPathW
function CopyFile(lpExistingFileName, lpNewFileName:PChar; bFailIfExists:BOOL):BOOL; stdcall;

//$EXTERNALSYM CopyFileA
function CopyFileA(lpExistingFileName, lpNewFileName: PAnsiChar; bFailIfExists: BOOL): BOOL; stdcall;

//$EXTERNALSYM CopyFileW
function CopyFileW(lpExistingFileName, lpNewFileName: PWideChar; bFailIfExists: BOOL): BOOL; stdcall;

Как видно для общения с Win XP вполне хватает и PChar (в C++ char*. Насколько я понял в MQL этот тип не присутсвует к сожалению), PAnsiChar и PWindeChar

Я сам дельфями не балуюсь, но то, что Вы написали похоже на "MS C++" реализацию, где есть такие типы как TCHAR, LPTSTR и LPCTSTR. Эти типы определяются во время условной компиляции и могут быть скомпилированы как char, char* и const char* в случае ANSI компиляции и unsigned short (соответствует wchar_t), unsigned short* (wchar_t*) и const unsigned short* (const wchar_t*) в случае компиляции Unicode.

Ваш тип PChar соответствует LPCTSTR, PAnsiChar - LPCSTR, PWideChar - LPCWSTR

У Вас в дельфях должна быть опция для компиляции в режиме юникод или просто объявление DEFINE, как ключ для компиляции в Юникод. Поищите и наверняка найдете. Потому что, Ваша функция CopyFile, на самом деле, в Windows не существует. Зато существуют CopyFileA и CopyFileW.

Надеюсь мой пост был полезен.

Причина обращения: