Пример кода который использую, выход стохастика за 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 buffersdouble FastStochBuffer1[];double FastStochBuffer2[];double FastStochColors[];double SlowStochBuffer[];double CriticalRangeBuffer1[];double CriticalRangeBuffer2[];// indicators handlesint FastStochHandles;int SlowStochHandles;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit(){//--- indicator buffers mappingSetIndexBuffer(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(constint rates_total,constint prev_calculated,constdatetime&Time[],constdouble&Open[],constdouble&High[],constdouble&Low[],constdouble&Close[],constlong& TickVolume[],constlong&Volume[],constint& 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;}elseif(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 callreturn(rates_total);}//+------------------------------------------------------------------+
Уважаемые разработчики, откройте секрет при помощи чего компилировался пример DLL для MT4.
Перепробовал почти весь арсенал который у меня на компе стоит (только Delphi 2009 осталось испробовать), не удается корректно передать/получить обычную строку из DLL.
Если можно обновите плиз пример для MT5.
Желательно еще пополнить типы данных отвечающие за строки (ну иди каким-то образом дать возможность переделывать ANSI в Unicode и обратно).
PS
Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.
А в набор функций работы с тексом добавить две функции UnicodeToString и StringToUnicode.
Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.
А в набор функций работы с текстом добавить две функции UnicodeToString и StringToUnicode.
При помощи Borland C++ Builder 6 я всеж смог создать пример для DLL (там кстати возвращается char* - что как я понял из таблицы должно соответствовать PChar).
PS
Хотя код только реализует нормальный возврат переданной из терминала строки (старый пример для MT4)
Желательно как я уже написал выше добавить в терминал две функции по преобразованию ANSI в Unicode.
А как наилучшее решение проблемы немного поправить типы данных (за
основу для новых типов можно взять ту таблицу что приводилось мной выше)
Уважаемые разработчики, откройте секрет при помощи чего компилировался пример 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
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), но хочется чего-то более сложного.
В компиляторе ошибка при расчёте индексов, в случае если содержится умножение внутри квадратных скобок.
Программа компиляется без проблем, однако работает с проблемами // 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;// работает как надо
}
Не знаю как это реализовано на 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.
На сколько я помню String и PChar совместимые типы (по крайней мере в Delphi).
Привожу таблицу совмещения типов данных Delphi и C++ (взятую из справки Борланда)
Если пишете принципиально на delphi7 то PWideChar Вам в помошь если среда разработки не так принципиально то в delphi 2009 строки по умолчанию unicode
http://www.citforum.ru/programming/delphi/unicode/1.shtml
Вопрос разработчикам:
как избавится то этого эфекта?
Пример кода который использую, выход стохастика за 80 и 20, с 20 проблем нет хотя тоже смноится не ровным отсечением а /===\ ну да ладно, а вот с 80 проблем.
Подскажите как от этого избавится!!!
Уважаемые разработчики, откройте секрет при помощи чего компилировался пример DLL для MT4.
Перепробовал почти весь арсенал который у меня на компе стоит (только Delphi 2009 осталось испробовать), не удается корректно передать/получить обычную строку из DLL.
Если можно обновите плиз пример для MT5.
Желательно еще пополнить типы данных отвечающие за строки (ну иди каким-то образом дать возможность переделывать ANSI в Unicode и обратно).
PS
Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.
А в набор функций работы с тексом добавить две функции UnicodeToString и StringToUnicode.
PS
Для удобства понимания можно будет к примеру оставить за string старый формат (ANSI), а для нового добавить UnicodeString.
А в набор функций работы с текстом добавить две функции UnicodeToString и StringToUnicode.
При помощи Borland C++ Builder 6 я всеж смог создать пример для DLL (там кстати возвращается char* - что как я понял из таблицы должно соответствовать PChar).
PS
Хотя код только реализует нормальный возврат переданной из терминала строки (старый пример для MT4)
Желательно как я уже написал выше добавить в терминал две функции по преобразованию ANSI в Unicode.
А как наилучшее решение проблемы немного поправить типы данных (за основу для новых типов можно взять ту таблицу что приводилось мной выше)Уважаемые разработчики, откройте секрет при помощи чего компилировался пример 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
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:
Как видно для общения с Win XP вполне хватает и PChar (в C++ char*. Насколько я понял в MQL этот тип не присутсвует к сожалению), PAnsiChar и PWindeChar
PS
Конечно можно общаться с DLL "правильно" и профеесионально, только при при помощи стандартных типов данных (я про bool, int и double), но хочется чего-то более сложного.
Тут один вопросик возник - а что должна возвращать строка 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; // работает как надо }...
Не знаю как это реализовано на MS С++ (тем более при условии юникодности), но вот пример вызова функций WinAPI:
Как видно для общения с 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.
Надеюсь мой пост был полезен.