mql4:在线编码空缓冲区
Posted
技术标签:
【中文标题】mql4:在线编码空缓冲区【英文标题】:mql4 : coding empty buffer in line 【发布时间】:2014-10-14 13:34:28 【问题描述】:所以我做了一些编码,现在有空缓冲区我想问一下 EMPTY_BUFFER 的感觉 所以如果使用 IF line == EMPTY BUFFER 然后填充它..我已经尝试了一些编码但仍然没有填充空缓冲区
#property strict
#property indicator_level1 75.0
#property indicator_level2 25.0
#property indicator_levelcolor LimeGreen
#property indicator_levelwidth 1
#property indicator_levelstyle 0
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Green
#property indicator_color5 Red
extern string howtouse= "scalping in m5";
extern string contact = "reiz_gamer@yahoo.co.id";
extern string created = "created by reza rahmad";
extern int barsToProcess=100;
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double buy[];
double sell[];
int values;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
//---
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexStyle(3,DRAW_NONE);
SetIndexBuffer(3,buy);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW,EMPTY,3,Magenta);
SetIndexArrow(4,234);
SetIndexBuffer(4,sell);
SetIndexEmptyValue(4,0.0);
// initialization of the generator of random numbers
ObjectCreate("sig",OBJ_TEXT,0,0,0,0,0);
ObjectSetText("sig","TAHAN",10,"Times New Roman",Magenta);
ObjectCreate("sig1",OBJ_LABEL,0,0,0,0,0);
ObjectSet("sig1",OBJPROP_XDISTANCE,750);
ObjectSet("sig1",OBJPROP_YDISTANCE,20);
ObjectSetText("sig1","created by reza rahmad scalping use in tf 5m",10,"Times New Roman",Magenta);
//---
return(0);
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int deinit()
ObjectDelete("tare");
ObjectDelete("tarmid");
ObjectDelete("tare1");
ObjectDelete("sig");
ObjectDelete("sig1");
return(0);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
int counted_bars=IndicatorCounted(),
limit;
if(counted_bars>0)
counted_bars--;
limit=Bars-counted_bars;
if(limit>barsToProcess)
limit=barsToProcess;
for(int i=0;i<limit;i++)
double main5 = iStochastic( NULL, PERIOD_M5, 14, 3, 3, MODE_SMMA, 0, MODE_MAIN, i );
double signal5 = iStochastic( NULL, PERIOD_M5, 14, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, i );
double ma20 = iMA( NULL, PERIOD_M5, 20, 0, MODE_SMA, PRICE_CLOSE, 0 );
double ma5 = iMA( NULL, PERIOD_M5, 5, 0, MODE_SMA, PRICE_CLOSE, 0 );
ExtMapBuffer1[i] = EMPTY_VALUE;
ExtMapBuffer2[i] = EMPTY_VALUE;
if ( main5 > signal5
&& High[0] > ma5
)
ExtMapBuffer1[i] = ( ( Close[i+1] + Close[i] ) / 2 );
values = 1;
if ( main5 < signal5
&& Low[0] < ma5
)
ExtMapBuffer2[i] = ( ( Close[i+1] + Close[i] ) / 2 );
values = 2;
picture example
【问题讨论】:
尊敬的 Reza,您能否发布整个 CustomIndicator 标题行的 #-directive(s)、相关缓冲区的设置及其初始化的代码?谢谢 我已经添加了所有代码,你能帮忙解决空缓冲区的问题吗?并填补空白 检查答案,Reza,并随时提出问题。 希望您认为它对您的编码有用。 【参考方案1】:如何理解 MQL4 自定义指标中的 EMPTY_VALUE?
MQL4 的惯例是不绘制/显示 CustomIndicator
-line-segments 到/来自 Bars,其中CustomIndicator
-storageBuffer 包含一个特别识别的“Empty_Value” == EMPTY_VALUE | a value pre-set via SetIndexEmptyValue()
。
默认情况下,“Empty_Value”是EMPTY_VALUE
。
关键步骤是这个技巧:
if ( main5 < signal5
&& Low[0] < ma5
)
ExtMapBuffer2[i] = ( ( Close[i+1] + Close[i] ) / 2 ); // .CALC/.STO
values = MAIN_UNDER_SIGNAL; // .SET
if ( values_PREV!= MAIN_UNDER_SIGNAL ) // ? WAS A FLIP
values_PREV = MAIN_UNDER_SIGNAL; // .SET
ExtMapBuffer3[i+1] = ExtMapBuffer1[i+1]; // .STO[i+1]
ExtMapBuffer3[i ] = ExtMapBuffer2[i ]; // .STO[i+0]
New-MQL4 代码上下文中的建议更改如下:
// ------------------------------------------------------------------------------------
// FOR AN EA-INTEGRATION INTERFACE, ref. below
// ------------------------------------------------------------------------------------
#property strict // check this against OnCalculate() syntax requirement
#property indicator_separate_window
//roperty indicator_level1 75.0 // N/A for aPriceDOMAIN line
//roperty indicator_level2 25.0 // N/A for aPriceDOMAIN line
//roperty indicator_levelcolor clrLimeGreen
//roperty indicator_levelwidth 1
//roperty indicator_levelstyle 0
//roperty indicator_buffers 5 // not used
#property indicator_buffers 3
#property indicator_color1 clrGreen
#property indicator_color2 clrRed
#property indicator_color3 clrDimGray
/*roperty indicator_color4 Green // not used
#property indicator_color5 Red // not used
*/
#property description "Scalping in M5 Custom Indicator......................"
#property description "How to use it ......................................."
#property description "How to setup ........................................"
extern string howtouse = "scalping in M5"; // "New"-MQL4 shows comments in dialog box
extern string contact = "reiz_gamer@yahoo.co.id"; // Contact Email
extern string created = "created by reza rahmad"; // copyright notice
extern int barsToProcess = 100; // Bars To Process ( Depth )
double ExtMapBuffer1[],
ExtMapBuffer2[],
ExtMapBuffer3[];
double buy[];
double sell[];
int values,
values_PREV = EMPTY; // <STATE-FULL>-logic
#define MAIN_ABOVE_SIGNAL 1
#define MAIN_UNDER_SIGNAL 2
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
IndicatorShortName( "SigREZ( " + DoubleToStr( barsToProcess, 0 ) + " )");
IndicatorDigits( Digits + 1 ); // override default decimal points
// to be distinguishable once AVG(Close1,Close0) values are calculated
SetIndexStyle( 0, DRAW_LINE ); // MAIN_ABOVE_SIGNAL
SetIndexBuffer( 0, ExtMapBuffer1 ); // segments for values == 1
SetIndexDrawBegin( 0, barsToProcess );
SetIndexStyle( 1, DRAW_LINE ); // MAIN_UNDER_SIGNAL
SetIndexBuffer( 1, ExtMapBuffer2 ); // segments for values == 2
SetIndexDrawBegin( 1, barsToProcess );
SetIndexStyle( 2, DRAW_LINE ); // EMPTY_SEGMENTs
SetIndexBuffer( 2, ExtMapBuffer3 );
SetIndexDrawBegin( 2, barsToProcess );
/*
SetIndexStyle( 3, DRAW_NONE ); // not used
SetIndexBuffer( 3, buy );
SetIndexEmptyValue( 3, 0.0 );
SetIndexStyle( 4, DRAW_ARROW, EMPTY, 3, Magenta );
SetIndexArrow( 4, 234 );
SetIndexBuffer( 4, sell );
SetIndexEmptyValue( 4, 0.0 );
*/
// ----------------------------------------------------------------------------------
// initialization of the generator of random numbers
// ----------------------------------------------------------------------------------
ObjectCreate( "sig", OBJ_TEXT, 0, 0, 0, 0, 0 );
ObjectSetText( "sig", "TAHAN", 10, "Times New Roman", Magenta );
ObjectCreate( "sig1", OBJ_LABEL, 0, 0, 0, 0, 0 );
ObjectSet( "sig1", OBJPROP_XDISTANCE, 750 );
ObjectSet( "sig1", OBJPROP_YDISTANCE, 20 );
ObjectSetText( "sig1", "created by reza rahmad scalping use in tf 5m", 10, "Times New Roman", Magenta );
return(0);
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int deinit()
ObjectDelete( "tare" );
ObjectDelete( "tarmid" );
ObjectDelete( "tare1" );
ObjectDelete( "sig" );
ObjectDelete( "sig1" );
return(0);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
int limit = Bars,
counted_bars = IndicatorCounted();
if ( counted_bars > 0 ) counted_bars--;
limit -= counted_bars;
if ( limit > barsToProcess ) limit = barsToProcess;
for ( int i = 0; i < limit; i++ )
double main5 = iStochastic( NULL, PERIOD_M5, 14, 3, 3, MODE_SMMA, 0, MODE_MAIN, i );
double signal5 = iStochastic( NULL, PERIOD_M5, 14, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, i );
double ma20 = iMA( NULL, PERIOD_M5, 20, 0, MODE_SMA, PRICE_CLOSE, 0 );
double ma5 = iMA( NULL, PERIOD_M5, 5, 0, MODE_SMA, PRICE_CLOSE, 0 );
if ( main5 > signal5
&& High[0] > ma5
)
ExtMapBuffer1[i] = ( ( Close[i+1] + Close[i] ) / 2 ); // .CALC/.STO
values = MAIN_ABOVE_SIGNAL; // .SET
if ( values_PREV!= MAIN_ABOVE_SIGNAL ) // ? WAS A FLIP
values_PREV = MAIN_ABOVE_SIGNAL; // .SET
ExtMapBuffer3[i+1] = ExtMapBuffer2[i+1]; // .STO[i+1]
ExtMapBuffer3[i ] = ExtMapBuffer1[i ]; // .STO[i+0]
if ( main5 < signal5
&& Low[0] < ma5
)
ExtMapBuffer2[i] = ( ( Close[i+1] + Close[i] ) / 2 ); // .CALC/.STO
values = MAIN_UNDER_SIGNAL; // .SET
if ( values_PREV!= MAIN_UNDER_SIGNAL ) // ? WAS A FLIP
values_PREV = MAIN_UNDER_SIGNAL; // .SET
ExtMapBuffer3[i+1] = ExtMapBuffer1[i+1]; // .STO[i+1]
ExtMapBuffer3[i ] = ExtMapBuffer2[i ]; // .STO[i+0]
在 EA 和自定义指标之间实现更安全的 MQL4 集成接口的工具
由于 iCustom()
语法的性质和参数的顺序,创建一个复制/粘贴接口模板作为标题更安全-EA 部分,在自定义指标设计阶段,将为 safe-call-API 合约准备所有相关细节(无论技术上有多弱)
这个模板工具避免了在调试语法上可行的过程中的无数麻烦和生产力损失,但是由于传递了错误的、混合不当的参数(缺少一个/一个错误值/一个错误-订单/...)
// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// COPY/PASTE.START
// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// CALL-er SIDE INTERFACE |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//
// #define sIndicatorPathNAME "#AliceInTheWonderlands_msMOD_0.00"
//
// //_____________________________________INPUT(s)
// // NONE // n/a
//
// //_____________________________________OUTPUT(s):
// #define iOutputDoubleOpenBUFFER 0
// #define iOutputDoubleHighBUFFER 1
// #define iOutputDoubleLowBUFFER 2
// #define iOutputDoubleCloseBUFFER 3
// #define iOutputDoubleVolumeBUFFER 4
// #define iOutputDoubleTimeBUFFER 5
//
// double iCustom( _Symbol, // string symbol, // symbol: Symbol name on the data of which the indicator will be calculated. NULL means the current symbol.
// PERIOD_CURRENT, // int timeframe, // timeframe
// sIndicatorPathNAME, // string name, // path/name of the custom indicator compiled program: Custom indicator compiled program name, relative to the root indicators directory (MQL4/Indicators/). If the indicator is located in subdirectory, for example, in MQL4/Indicators/Examples, its name must be specified as "Examples\\indicator_name" (double backslash "\\"must be specified as separator instead of a single one).
// <<N/A>>, // ...[1] ..., // custom indicator [1]-st input parameters (if necessary)
// // ...[2+] // custom indicator further input parameters (if necessary)
// <iOutputDouble*BUFFER>, // int mode, // line index: Line index. Can be from 0 to 7 and must correspond with the index, specified in call of the SetIndexBuffer() function.
// i // int bar_shift // shift
// );
// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// COPY/PASTE.END
// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
剩余的差距来自代码设计。 使用三重缓冲线构造的演示方法完全涵盖了所提出的问题。
剩下的问题与业务逻辑算法化有关,它是由 O/P 以 if()...
构造函数的独立序列形式编码的,根本无法正确处理所有现有的 Tri-State-FSA 转换。
【讨论】:
谢谢陛下,但还是有问题,还是有差距dropbox.com/s/ewinfh7ymjf1pew/hasil.png?dl=0 当然,原因不在于三缓冲线结构,而在于算法中使用的串行独立 if()-s,因为它不包括这些情况( state-三态FSA的转换)。以上是关于mql4:在线编码空缓冲区的主要内容,如果未能解决你的问题,请参考以下文章