[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 546

 

该EA有以下块(事件计数器)。

如果(isCloseLastPosByStop()==True) //如果最后一笔订单是由Stop关闭。

{
N=N+1。
Alert(N, " moose")。
}否则N=0。

问题:如何将数据写入文件(excel)而不是在屏幕上显示?

 
Dimka-novitsek:

下午好,你能告诉我怎么做吗?我在一个循环中选择一个订单,我去看哪个订单是最后一个,并记住它,所以ticket = OrderTicket()。

在这种情况下,让我们说它是第二号。 稍后,如果(ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY)。

我经常得到错误4105--没有选择的订单!!!。


而这是因为订单还没有结束。它不在MODE_HISTORY中,它仍然在MODE_TRADES中。
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

不可能!为什么不呢?在超额完成任务的时候,没有任何未结订单!这就是所谓的 "超额"。也许我不明白。

搜索周期也在历史上!这就是我把它赋值给int ticket变量的地方!

它发誓,对不起,2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30:警告: 卖出选择错误 HISTORYticket 4105

当它从MODE_HISTORY到MODE_TRADES?

而最重要的是,我在历史上借助于订单选择,选择了相同的订单,而且是先选择的,否则我就不能用它来工作了!没有任何逻辑!!!!!!,我很震惊...




 
Dimka-novitsek:

不可能!为什么不呢?在超额完成任务的时候,并没有任何未结订单!这就是所谓的超额完成任务。也许我不明白。

搜索周期也在历史上!这就是我把它赋值给int ticket变量的地方!

它发誓,对不起,2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: 警告:卖出选择错误 HISTORYticket 4105

当它从MODE_HISTORY到MODE_TRADES时?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
在开头添加了一行,并更正了后面两行代码。
 
谢谢你!!!。
 

帮助在EA中插入一个止损点

附加的文件:
my_1.mq4  10 kb
 
请分享计算最大允许手数的功能,同时考虑到未结头寸,即股本。 标准功能计算风险,但如果有交易,就没有足够的钱来打开它们。
 
T-G:
请分享计算最大允许手数的功能,同时考虑到未结头寸,即股本。 标准功能计算风险,但如果有交易,就没有足够的钱来打开它们。


在最简单的情况下,它是这样的。

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

伙计们,你们能就这个问题提供建议吗?

这里有一个脚本,可以从crenfx找到之字形反冲的最大尺寸--见这里

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

我把它扔在M5的仪器图表上--它在默认的时间框架下工作正常。

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

这是Alpari办公室中用F2加载符号时的最大历史深度--我检查过了,即它看起来像客户终端的 "专家 "标签的内容--似乎是真的。

当在我的EA中使用相同的脚本设计,在同一个M5图表周期的相同时间间隔中,它不能正确计数,即

它计算出的数字或0相当不同(比脚本中的小)。可能是什么错误或可能是某种历史的不一致?谢谢你。

例如,我在找到故障安全装置的预计时间后开始使用猫头鹰的测试器,理论上一切正常,脚本和猫头鹰的数字应该是一样的......可能的错误是什么?

 

我就是这样向我的猫头鹰收取这个脚本的。

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

似乎都是一样的--会有什么错误呢?