任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 930

 

DiPach , 再次感谢你的帮助。我已经分析了你的例子。对我的启动代码做了一些修改。其结果是这样的。

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

改变了什么。

1.我把包含int awd1[]; 数组声明的一行移到了OnStart()函数中

2.增加了ArrayResize(awd1,6,7)函数

3.脚本是有效的。

我将尝试得出一些结论。在脚本中,在OnStart()函数中声明数组是正确的。在数组被声明后,必须使用ArrayResize()函数对其大小进行必然的定义,否则编译器将发誓。我的结论是否正确?如果没有,请给出正确的解释。

 
silachara:

DiPach , 再次感谢你的帮助。我已经分析了你的例子。对我的启动代码做了一些修改。其结果是这样的。

改变了什么。

1.将包含int awd1[];数组声明的一行移至OnStart()函数内。

2.增加了ArrayResize(awd1,6,7)函数。

3.脚本是有效的。

我将试图得出结论。在脚本中,在OnStart()函数中声明数组是正确的。在数组被声明后,必须使用ArrayResize()函数对其大小进行必要的定义,否则编译器将产生一个错误。我的结论是否正确?如果没有,请给出正确的解释。

一般说来,是的。而且它将发挥作用,至少是无声的,但非常好。:)

我只说明以下几点。

1. 当你声明正常的变量和数组时,我认为你应该考虑这个脚本(或EA/指示器)要做什么,以及这些变量/数组的用途。

你所附的脚本工作流程允许不是在全局程序层面,而是在本地声明变量。也就是说,数组被声明一次。而且,在Start()体中没有必要重复(循环)声明,例如, 我们开始for()循环之前,以及在for(){}之后 ,我们还需要一些变量声明。


因此,数组不是在程序的全局变量层面上声明的,而是在for()循环语句之前 的OnStart()正文中声明的--在这种程序执行方案中是完全可以接受的。

在我看来,如果在程序中没有必要在全局变量层面上声明什么,我们最好利用这个机会,在本地声明一切可以声明的东西。

2. 至于代码,让我把它说清楚。

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

就是说。

  • 你不应该在for中使用<=符号(小于等于)。我的意思是它的位置(i=0;i<=5;i++)。简单地把<(小于)和数字6代替5。
for(int i=0;i<6;i++)

这就是5的方式,对于来说是合适的。

for(int i=5;i>=0;i--)
  • 我记得之前遇到过这样的信息:Stringconcatenate 函数有助于加快长文本的处理。这就是为什么我通常在我的代码中使用它。我也把它加在这里,以备不时之需。


P./S.: 还有一个澄清,以防万一,使用ArrayResize()--用于动态 数组。 在这个函数的文档中,有这样的信息:这个函数不能调整动态数组的大小。

 
Best_ATS:
为什么我不能添加朋友?
而在生活中,如果不亲自了解一个朋友,从工作中,你如何想象他或她呢?
 

你好!我怎样才能使新的价格先显示出来,而以前的价格降到底部,如此循环?我举了一个例子来说明问题。

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

你好!我怎样才能使新的价格先显示出来,而以前的价格降到底部,如此循环?这将是清楚的做了一个例子。

我做了一个例子,有了条件或多或少你可以自己想出来。

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

我做了一个例子,你可以或多或少地自己想出这些条款。


谢谢你!
 
abeiks:

你好!我怎样才能使新的价格先显示出来,而以前的价格降到底部,如此循环?为了说清楚,我举了一个例子。

这里是一个完全原始的代码。

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

这里有一个完全原始的代码做的。




谢谢你!
 

大家好。试图用一个简陋的脚本在策略测试器中 打开一个交易订单,失败。

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0," ,0,0,Blue)。

if(res>-1)Alert("Open BUY order with ticket " ,res);

//----

return(0);

}

我把脚本放在可视化模式的测试图表上,但交易订单在MT4终端打开。

在使用SimpleFXTester_v2.ex4的策略测试器中,我也无法获得未结订单的信息。

请帮助我理解这一点。

 
kosmos0975:

大家好。试图用一个简陋的脚本在策略测试器中打开一个交易订单,失败。

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0," ,0,0,Blue)。

if(res>-1)Alert("Open BUY order with ticket " ,res);

//----

return(0);

}

我把脚本放在可视化模式的测试图表上,但交易订单在MT4终端打开。

在使用SimpleFXTester_v2.ex4的策略测试器中,我也无法获得未结订单的信息。

请帮助我理解这一点。

策略测试器中的脚本不起作用。