MetaTrader拡張モジュール(DLL)の作成 - ページ 13 1...6789101112131415 新しいコメント Mladen Rakic 2014.10.05 19:21 #121 apprentice coder: ありがとうございます dll関数から戻り値として配列を取得する方法はありますか? メタトレーダーでこれを行うには、配列を作成し、それをDLL関数に 参照渡し、その配列を埋めるしかありません。メタトレーダーはDLL関数の戻り値として配列を受け付けません。 learning 2014.10.05 20:07 #122 mladen: メタトレーダーでそれを行う唯一の方法は、配列を作成し、それをDLL関数に参照渡し、その配列を埋めることです。メタトレーダーはDLL関数の戻り値として配列を受け付けません。 OK, Thanks Erdenebayar Lamjav 2014.10.23 12:25 #123 mql#で問題が発生しました。 ここではC#のコードは問題ありません。 using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE] Here mql code. [CODE] //+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+ しかし、ライブチャートをテストすると、Metatraderプラットフォームは自動的に閉じてしまう。なぜでしょうか? Create your own MetaTrader コーディングのヘルプ Coding help pipscooper 2015.03.13 03:42 #124 C#のDLL関数の 内部で必ずエラー処理を行うのが鉄則です。これを怠ると、メタトレーダーが自動的に終了してしまうという現象が発生します。各パブリックDLL関数にtry/catchブロックを入れると、何が問題を引き起こしているのかが分かります。おそらく、DLL内の未処理エラーがメタトレーダーにフィードバックされ、メタトレーダーがシャットダウンしているのでしょう。エラー処理とエラーへの対処は、C#からMT4へのDLLプロセスで最も難しい部分です。私はこのフォーラムを頻繁にチェックしていないので、ブログのコメントとして質問をすると、通知が来て、よりタイムリーに回答することができます。 sosa247: ここでは、C#の問題コードではありません。 using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE] Here mql code. [CODE] //+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+ しかし、私がライブチャートをテストするとき、その後、メタトレーダープラットフォームは自動的に閉じます。なぜ私のために? techmac 2015.03.13 21:45 #125 sosa247: ここでは、C#のコードで問題はありません。 using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE] Here mql code. [CODE] //+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+ しかし、ライブチャートをテストすると、Metatraderプラットフォームは自動的に終了します。なぜですか? 古いバージョンで動作した例があれば教えてください。 name 2015.03.14 18:24 #126 おそらくプロテクトの問題 Mladen Rakic 2015.03.15 10:07 #127 pipscooper: 経験則から言うと、C#の各DLL関数の内部で必ずエラー処理を行ってください。これを怠ると、メタトレーダーが自動的に終了してしまうという現象が発生します。各パブリックDLL関数内にtry/catchブロックを置くと、何が問題を引き起こしているのかがわかります。おそらく、DLL内の未処理エラーがメタトレーダーにフィードバックされ、メタトレーダーがシャットダウンしているのでしょう。エラー処理とエラーへの対処は、C#からMT4へのDLLプロセスで最も難しい部分です。私はこのフォーラムを頻繁にチェックしていないので、ブログのコメントとして質問していただければ、通知が来て、よりタイムリーに回答できます。 このコードだけでは原因は特定できません(使用しているリソースの一部に問題があるのかもしれません)。 at120 2015.06.02 06:58 #128 こんにちは、皆さん。 DLLインジケータ/MT4を動かそうとするのですが・・・。これは再帰的SMAのコードですが、私はそれを動作させることはできません。私はブログからそれを得た。 どなたか、原因・故障箇所をご存知の方はいらっしゃいませんか? DLLファイルはC++で書かれており、VC 2010で何のエラーもなく(プロジェクトとして)コンパイルされます。 このコードを実行しようとすると、MT4は何もせず、インジケータも表示されません... 何かヒントがあれば教えてください。 ありがとうございました。 MQL4コード //sma_rec.mqh file begin #import "sma_rec.dll" void updateBuffer( double& Rates[], double& buffer[], int bars, int indicator_counted, int ma_period, double& internal_calcs[2] ); #import //sma_rec.mqh file end //sma_rec.mq4 file begin #include #property indicator_chart_window // indicator plotted in main chart window #property indicator_buffers 1 // one indicator line to be plotted #property indicator_color1 Red // plot colour is red - change via GUI //+------------------------------------------------------------------+ // Import and declare the DLL, with its parameters defined #import "sma_rec.dll" // history, buffer and internal_calcs are passed by reference, this means the dll // will receive pointers to the arrays void updateBuffer(double& Rates[][6], double& buffer[], int bars, int indicator_counted, int period, double& internal_calcs[2] ); #import extern int ma_period = 10; // default period is 10 - change via GUI extern int ma_shift = 0; // default is no shift - change via GUI double buffer[]; // the indicator buffer - the DLL will // write to this and it will be plotted double Rates[][6]; // this will later point to the complete // chart history double internal_calcs[2]; // this array will hold the values of the // internal calculations of the DLL and will // be read from and written to by the DLL. // The size of the array is set at 2. If // needs be, the size can be increased to // accommodate more complicated calculations // within the DLL. int init(){ // set up the indicator buffer SetIndexStyle(0, DRAW_LINE); SetIndexShift(0, ma_shift); SetIndexBuffer(0, buffer); SetIndexLabel(0, "Recursive SMA"); IndicatorDigits(Digits); } int start(){ ArrayCopyRates( Rates, NULL, 0 ); updateBuffer( Rates, buffer, Bars, IndicatorCounted(), ma_period, internal_calcs ); //Print(buffer[]); } //sma_rec.mq4 file end [/CODE] Code in C++ //dllmain.cpp: #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } main function of SMA rec.cpp [CODE] #include #include "stdafx.h" #include #define WIN32_LEAN_AND_MEAN #define MT4_EXPFUNC __declspec(dllexport) //+------------------------------------------------------------------+ //| MT4 HISTORY DATA STRUCT | //+------------------------------------------------------------------+ #pragma pack(push,1) struct RateInfo { __int64 ctm; double open; double low; double high; double close; unsigned __int64 vol_tick; // int spread; // unsigned __int64 vol_real; }; #pragma pack(pop) //--- struct MqlStr { int len; char *string; }; static int CompareMqlStr(const void *left,const void *right); //+------------------------------------------------------------------+ //| EXTERN_C __declspec(dllexport) void __stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] ) // MT4_EXPFUNC void _stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] ) { // check if the DLL is being called for the very first time if ( IndicatorCounted == 0 ) { // if so, calculate indicator values from the beginning of the array up to // "current" bar - firstly for buffer[0] to buffer[ma_period - 1] fill the // buffer with increasing moving average values up to the desired moving // average period i.e. the second bar in buffer has value of ma_period = 2; // the third bar in buffer array has value of ma_period = 3 etc. buffer[0] = Rates[0].close; buffer[1] = ( Rates[0].close + Rates[1].close ) / 2.0; for( int ii = 2 ; ii < ma_period ; ii++ ) { buffer = ( ( buffer * ii ) / (ii+1) ) + ( Rates.close/(ii+1) ); } // secondly, after the initial part of the buffer is filled, the rest of the // buffer is filled using a recursive SMA algorithm. If the SMA were // calculated by looping over previous bar values there would be ma_period-1 // additions and one division operation per loop of a nested loop. This // simple recursive algorithm does away with the need for a nested loop // completely and reduces the number of arithmetic operations to four per // bar. More importantly, for learning purposes, it will enable code to be // shown for passing parameters that hold the state of internal calculations // to and from the DLL. for( int ii = ma_period ; ii < Bars - 1 ; ii++ ) { buffer = ( buffer - (Rates.close/ma_period) ) + ( Rates.close/ma_period ); } // now return the values of the internal calculations to the internal_calcs // array pending the next call to the DLL internal_calcs[0] = (Rates.close/ma_period); // the value // to be used in the next SMA calculation internal_calcs[1] = Bars - 1; // how many indicator values calculated so far } // end of ( IndicatorCounted = 0 ) if statement for first call of the DLL. // Once this piece of the code has been run once, on the initial call to the // DLL, it will never be run again because the condition IndicatedCounted == // 0 will never be true again. // this next piece of code will be evaluated on the second and all subsequent // calls to the DLL because the condition IndicatorCounted > 0 will always be // true after the DLL's initial call. Note that the second part of the // logical AND, namely (Bars - 1) > internal_calcs[1], ensures that the code // will only run when a bar has completely formed and a new bar has opened. // This is important to ensure that values contained in the internal_calcs // array are not overwritten by the constantly changing values of the // currently forming bar. Note that, as above, this is a recursive SMA // algorithm so there is no loop. if ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1] ) // evaluates to TRUE if there is a new bar { buffer = ( buffer - internal_calcs[0] ) + ( Rates.close/ma_period ); // calculate new SMA value internal_calcs[0] = (Rates.close/ma_period); // update // internal_calcs with new value for next SMA calc. internal_calcs[1] = Bars - 1; // update how many indicator values calculated so // far } // end of ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1]) if // statement } // end of main function call Create your own MetaTrader Erratic C++ DLL updating C++ Convertion and Development Mladen Rakic 2015.06.03 06:33 #129 ジャーナルやエキスパートタブに表示されるエラーは何ですか? at120 2015.06.03 07:21 #130 Mladenさん、こんにちは。 回答ありがとうございます! ないですねー。それは困りましたね...。 インジケーターウィンドウは開くのですが、インジが表示されません...。 助けてくれてありがとう、そしてさようなら。 1...6789101112131415 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ありがとうございます dll関数から戻り値として配列を取得する方法はありますか?
メタトレーダーでこれを行うには、配列を作成し、それをDLL関数に 参照渡し、その配列を埋めるしかありません。メタトレーダーはDLL関数の戻り値として配列を受け付けません。
メタトレーダーでそれを行う唯一の方法は、配列を作成し、それをDLL関数に参照渡し、その配列を埋めることです。メタトレーダーはDLL関数の戻り値として配列を受け付けません。
OK, Thanks
mql#で問題が発生しました。
ここではC#のコードは問題ありません。
using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]
Here mql code.
[CODE]
//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+しかし、ライブチャートをテストすると、Metatraderプラットフォームは自動的に閉じてしまう。なぜでしょうか?
C#のDLL関数の 内部で必ずエラー処理を行うのが鉄則です。これを怠ると、メタトレーダーが自動的に終了してしまうという現象が発生します。各パブリックDLL関数にtry/catchブロックを入れると、何が問題を引き起こしているのかが分かります。おそらく、DLL内の未処理エラーがメタトレーダーにフィードバックされ、メタトレーダーがシャットダウンしているのでしょう。エラー処理とエラーへの対処は、C#からMT4へのDLLプロセスで最も難しい部分です。私はこのフォーラムを頻繁にチェックしていないので、ブログのコメントとして質問をすると、通知が来て、よりタイムリーに回答することができます。
ここでは、C#の問題コードではありません。
using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]
Here mql code.
[CODE]
//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+ここでは、C#のコードで問題はありません。
using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]
Here mql code.
[CODE]
//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+古いバージョンで動作した例があれば教えてください。
おそらくプロテクトの問題
経験則から言うと、C#の各DLL関数の内部で必ずエラー処理を行ってください。これを怠ると、メタトレーダーが自動的に終了してしまうという現象が発生します。各パブリックDLL関数内にtry/catchブロックを置くと、何が問題を引き起こしているのかがわかります。おそらく、DLL内の未処理エラーがメタトレーダーにフィードバックされ、メタトレーダーがシャットダウンしているのでしょう。エラー処理とエラーへの対処は、C#からMT4へのDLLプロセスで最も難しい部分です。私はこのフォーラムを頻繁にチェックしていないので、ブログのコメントとして質問していただければ、通知が来て、よりタイムリーに回答できます。
このコードだけでは原因は特定できません(使用しているリソースの一部に問題があるのかもしれません)。
こんにちは、皆さん。
DLLインジケータ/MT4を動かそうとするのですが・・・。これは再帰的SMAのコードですが、私はそれを動作させることはできません。私はブログからそれを得た。
どなたか、原因・故障箇所をご存知の方はいらっしゃいませんか?
DLLファイルはC++で書かれており、VC 2010で何のエラーもなく(プロジェクトとして)コンパイルされます。
このコードを実行しようとすると、MT4は何もせず、インジケータも表示されません...
何かヒントがあれば教えてください。
ありがとうございました。
MQL4コード
#import "sma_rec.dll"
void updateBuffer( double& Rates[], double& buffer[], int bars, int indicator_counted, int ma_period, double& internal_calcs[2] );
#import
//sma_rec.mqh file end
//sma_rec.mq4 file begin
#include
#property indicator_chart_window // indicator plotted in main chart window
#property indicator_buffers 1 // one indicator line to be plotted
#property indicator_color1 Red // plot colour is red - change via GUI
//+------------------------------------------------------------------+
// Import and declare the DLL, with its parameters defined
#import "sma_rec.dll"
// history, buffer and internal_calcs are passed by reference, this means the dll
// will receive pointers to the arrays
void updateBuffer(double& Rates[][6], double& buffer[], int bars, int indicator_counted, int period, double& internal_calcs[2] );
#import
extern int ma_period = 10; // default period is 10 - change via GUI
extern int ma_shift = 0; // default is no shift - change via GUI
double buffer[]; // the indicator buffer - the DLL will
// write to this and it will be plotted
double Rates[][6]; // this will later point to the complete
// chart history
double internal_calcs[2]; // this array will hold the values of the
// internal calculations of the DLL and will
// be read from and written to by the DLL.
// The size of the array is set at 2. If
// needs be, the size can be increased to
// accommodate more complicated calculations
// within the DLL.
int init(){
// set up the indicator buffer
SetIndexStyle(0, DRAW_LINE);
SetIndexShift(0, ma_shift);
SetIndexBuffer(0, buffer);
SetIndexLabel(0, "Recursive SMA");
IndicatorDigits(Digits);
}
int start(){
ArrayCopyRates( Rates, NULL, 0 );
updateBuffer( Rates, buffer, Bars, IndicatorCounted(), ma_period, internal_calcs );
//Print(buffer[]);
}
//sma_rec.mq4 file end
[/CODE]
Code in C++
//dllmain.cpp:
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
main function of SMA rec.cpp
[CODE]
#include
#include "stdafx.h"
#include
#define WIN32_LEAN_AND_MEAN
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//| MT4 HISTORY DATA STRUCT |
//+------------------------------------------------------------------+
#pragma pack(push,1)
struct RateInfo
{
__int64 ctm;
double open;
double low;
double high;
double close;
unsigned __int64 vol_tick;
// int spread;
// unsigned __int64 vol_real;
};
#pragma pack(pop)
//---
struct MqlStr
{
int len;
char *string;
};
static int CompareMqlStr(const void *left,const void *right);
//+------------------------------------------------------------------+
//|
EXTERN_C __declspec(dllexport) void __stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] )
// MT4_EXPFUNC void _stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] )
{
// check if the DLL is being called for the very first time
if ( IndicatorCounted == 0 )
{
// if so, calculate indicator values from the beginning of the array up to
// "current" bar - firstly for buffer[0] to buffer[ma_period - 1] fill the
// buffer with increasing moving average values up to the desired moving
// average period i.e. the second bar in buffer has value of ma_period = 2;
// the third bar in buffer array has value of ma_period = 3 etc.
buffer[0] = Rates[0].close;
buffer[1] = ( Rates[0].close + Rates[1].close ) / 2.0;
for( int ii = 2 ; ii < ma_period ; ii++ )
{
buffer = ( ( buffer * ii ) / (ii+1) ) + ( Rates.close/(ii+1) );
}
// secondly, after the initial part of the buffer is filled, the rest of the
// buffer is filled using a recursive SMA algorithm. If the SMA were
// calculated by looping over previous bar values there would be ma_period-1
// additions and one division operation per loop of a nested loop. This
// simple recursive algorithm does away with the need for a nested loop
// completely and reduces the number of arithmetic operations to four per
// bar. More importantly, for learning purposes, it will enable code to be
// shown for passing parameters that hold the state of internal calculations
// to and from the DLL.
for( int ii = ma_period ; ii < Bars - 1 ; ii++ )
{
buffer = ( buffer - (Rates.close/ma_period) ) + ( Rates.close/ma_period );
}
// now return the values of the internal calculations to the internal_calcs
// array pending the next call to the DLL
internal_calcs[0] = (Rates.close/ma_period);
// the value // to be used in the next SMA calculation
internal_calcs[1] = Bars - 1; // how many indicator values calculated so far
} // end of ( IndicatorCounted = 0 ) if statement for first call of the DLL.
// Once this piece of the code has been run once, on the initial call to the
// DLL, it will never be run again because the condition IndicatedCounted ==
// 0 will never be true again.
// this next piece of code will be evaluated on the second and all subsequent
// calls to the DLL because the condition IndicatorCounted > 0 will always be
// true after the DLL's initial call. Note that the second part of the
// logical AND, namely (Bars - 1) > internal_calcs[1], ensures that the code
// will only run when a bar has completely formed and a new bar has opened.
// This is important to ensure that values contained in the internal_calcs
// array are not overwritten by the constantly changing values of the
// currently forming bar. Note that, as above, this is a recursive SMA
// algorithm so there is no loop.
if ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1] ) // evaluates to TRUE if there is a new bar
{
buffer = ( buffer - internal_calcs[0] ) + ( Rates.close/ma_period ); // calculate new SMA value
internal_calcs[0] = (Rates.close/ma_period); // update
// internal_calcs with new value for next SMA calc.
internal_calcs[1] = Bars - 1; // update how many indicator values calculated so
// far
} // end of ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1]) if
// statement
} // end of main function call
ジャーナルやエキスパートタブに表示されるエラーは何ですか?
Mladenさん、こんにちは。
回答ありがとうございます!
ないですねー。それは困りましたね...。
インジケーターウィンドウは開くのですが、インジが表示されません...。
助けてくれてありがとう、そしてさようなら。