新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 182

 
Artyom Trishkin:
而且你还没有展示你的一段代码--不清楚你为什么要展示一个例子。

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

当EA工作了很长时间后,阵列变得太大,无法处理,我们需要减少它。所有旧的已关闭的订单都在开头,第一个发现的开放订单之后的所有东西都应该被留下。
 
Evgenii:

...
当EA运行了很长时间后,阵列变得太大,无法处理,我们需要减少它。所有旧的已关闭的订单都在开头,第一个发现的开放订单之后的一切都应该留下。

当EA重新启动时,结构阵列会发生什么变化?

 
Artyom Trishkin:

当EA重新启动时,结构阵列会发生什么变化?

阵列会崩溃,这个问题还没有得到解决。
 
Evgenii:
阵列将被删除,这个问题还没有得到解决。

在那里。而这一点在一开始就应该被考虑。

结论是显而易见的:数组必须被清零,然后用订单和头寸的当前状态重新填入。但这只应在你捕捉到账户中订单 或头寸数量 的变化时进行。

你手头永远只有订单和头寸的当前状态,不需要费力从数组中消除不存在的订单/头寸。而订单/仓位列表将不得不完全滚动浏览,或在一定的历史时期内,但只有在特定情况下--当账户中的订单/仓位数量发生变化时,才会滚动浏览。

 
Alexey Viktorov:
为什么需要这种变态的东西?

这样onInit就不会在每次重新初始化时旋转,并将静态数组 减少为一个实例,因为在某些地方它被写了两次......一般来说,这是资源优化。
......我将保持现状,目前比较简单。
 
LRA:
你声明了一个全局数组而没有指定大小。你的函数通过ArrayResize设置其大小。而它在全球范围内是可见的,OnInit被释放...

不太对,数组是静态的,有明确定义的值,单独初始化它没有意义(
 
Money_Maker:

以防止OnInit在每次重新初始化时旋转,并将静态数组 减少到一个实例,因为在某些地方它被写了两次......一般来说,这是资源优化。
......我还是保持现在的样子吧。
为了避免在每次重新初始化时在OnOnit()中循环,只需检查去初始化的原因UninitializeReason(),我就不会再得到什么。减少静态阵列是什么意思?嗯,一般来说,你更清楚。
 
在MT4测试器中不考虑佣金吗?
 
Andrey Dik:
在MT4测试器中不考虑佣金吗?
似乎你必须连接到一个有佣金的账户,才会被考虑在内。
 

关于Print()函数 的问题;如何使Print()在EA中打印出数据和日期(日)?帮助初学者了解plz,把代码重新制作,为了实验,事先诱导 "pivot "cbs!


代码本身。PivotsDaily v2.mq4


#property indicator_chart_window

#property indicator_buffers 3

#property indicator_color1 Lime

#property indicator_color2 Blue

#property indicator_color3 Red


//---- 输入参数

外在的CountBars=300。

//---- 缓冲区

双重PBuffer[]。

双重S1Buffer[]。

双倍R1Buffer[]。


string Pivot="P", Sup1="S 1", Res1="R 1"。


int fontsize=10。

双P,S1,R1,S2,R2,S3,R3。

double LastHigh,LastLow,x;

//+------------------------------------------------------------------+

//|Custor指示器去初始化功能|

//+------------------------------------------------------------------+

int deinit()

{


ObjectDelete("Pivot")。

ObjectDelete("S1")。

ObjectDelete("R1")。

return(0);

}

//+------------------------------------------------------------------+

//|自定义指标初始化函数

//+------------------------------------------------------------------+

int init()

{

string short_name;


IndicatorBuffers(7)。

//---- 指标线

SetIndexStyle(0,DRAW_ARROW,2,1,Lime)。

SetIndexArrow(0,158);

SetIndexStyle(1,DRAW_ARROW,2,1,Blue)。

SetIndexArrow(1,158);

SetIndexStyle(2,DRAW_ARROW,2,1,Red)。

SetIndexArrow(2,158);


SetIndexBuffer(0,PBuffer)。

SetIndexBuffer(1,S1Buffer)。

SetIndexBuffer(2,R1Buffer)。


//---- DataWindow和指标子窗口标签的名称

short_name="Pivot"。

IndicatorShortName(short_name)。

SetIndexLabel(0,short_name)。

short_name="R1"。

IndicatorShortName(short_name)。

SetIndexLabel(2,short_name)。


short_name="S1"。

IndicatorShortName(short_name)。

SetIndexLabel(1,short_name)。


SetIndexDrawBegin(0,6)。

//----


return(0);

}

//+------------------------------------------------------------------+

//|自定义指标迭代函数|

//+------------------------------------------------------------------+

int start()


{

int counted_bars=IndicatorCounted()。


int limit, i;

//---- 指标计算

如果(counted_bars==0)

{

x=Period()。

如果(x>CountBars)返回(-1)。

ObjectCreate("Pivot", OBJ_TEXT, 0, 0,0);

ObjectSetText("Pivot", " Pivot",10, "Arial",Lime);

ObjectCreate("S1", OBJ_TEXT, 0, 0, 0)。

ObjectSetText("S1", " S1",10, "Arial",Blue);

ObjectCreate("R1", OBJ_TEXT, 0, 0, 0)。

ObjectSetText("R1", " R1",10, "Arial",Red);

}

if(counted_bars<0) return(-1);


limit=(Bars-counted_bars)-1。


for (i=limit; i>=0;i--)

{

如果(TimeDayOfWeek(Time[i]) !=0)

{

如果(High[i+1]>LastHigh)LastHigh=High[i+1]。

如果(Low[i+1]<LastLow)LastLow=Low[i+1]。

}


如果(

TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0

)

{

P=Close[i+1]。

R1 = LastLow。

S1 = LastHigh。

S2=高[i]-低[i]。

S3=High[i]-Open[i+1];

如果(S3==0)

{R2=S3;}否则{R2 = S2/S3;}。

Print("R2",R2); // <= 我如何让打印机加上数据来打印日期?


LastLow=Open[i]; LastHigh=Open[i];

ObjectMove("Pivot", 0, Time[i],P);

ObjectMove("S1", 0, Time[i],S1);

ObjectMove("R1", 0, Time[i],R1);

}

PBuffer[i]=P。

S1Buffer[i]=S1。

R1Buffer[i]=R1。

}

//----

return(0);

}