[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 397

 
lottamer:

它起作用了!说实话,我有这个想法,用OR代替AND....,但...:)))))))))))))))))))))

谢谢!现在我明白了这个逻辑,虽然要计算15个关闭的,我必须把代码吹到气球大小!我想这是一个很好的办法。

能否将所有这些都压缩到一个循环中? 并且只用所需的N个交易数量的参数来代替?

这里是搜索N个最近关闭的订单的可能方式之一,寻找的订单可以通过类型(买入,卖出)和盈利能力(亏损,盈利)进行过滤。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция получает Ticket следующего перед fdt_Time закрытого ордера         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketLastClosePos (int fi_Type = -2,          // OrderType()
                             int fi_TypeProfit = 0,     // флаг профитности ордеров: 0 - все, -1 - убыточные, 1 - прибыльные
                             datetime fdt_Time = 0)     // Точка отсчёта времени
{
    datetime ldt_CloseTime = 0, ldt_LastTime = 0;
    double   ld_Profit = 0.;
    int      li_Ticket = 0, li_Total = OrdersHistoryTotal();
//----
    for (int li_ORD = li_Total - 1; li_ORD >= 0; li_ORD--)
    {
        //if (!fCheck_MyOrders (li_ORD, fi_Type, MODE_HISTORY)) continue;
        // Здесь прописываете свою фильтрацию ордеров
        ldt_CloseTime = OrderCloseTime();
        //---- Пропускаем ордера, закрытые после указанной даты
        if (fdt_Time != 0) if (fdt_Time <= ldt_CloseTime) continue;
        if (ldt_LastTime >= ldt_CloseTime) continue;
        ld_Profit = OrderProfit();
        //---- Фильтруем ордера по профитности
        if (fi_TypeProfit > 0) if (ld_Profit < 0.) continue;
        if (fi_TypeProfit < 0) if (ld_Profit > 0.) continue;
        ldt_LastTime = ldt_CloseTime;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция получает Tickets N закрытых ордеров                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketsLastCloseOrd (int fi_NUM,                // Количество искомых тикетов
                              int& ar_Tickets[],         // возвращаемый массив с тикетами
                              int fi_Type = -2,          // OrderType()
                              int fi_TypeProfit = 0)     // флаг профитности ордеров: 0 - все, -1 - убыточные, 1 - прибыльные
{
    int      li_cnt = 0, li_Ticket;
    datetime ldt_Time = 0;
//----
    for (int li_IND = 0; li_IND < fi_NUM; li_IND++)
    {
        li_Ticket = fGet_TicketLastClosePos (fi_Type, fi_TypeProfit, ldt_Time);
        if (li_Ticket > 0)
        {
            li_cnt++;
            ArrayResize (ar_Tickets, li_cnt);
            ar_Tickets[li_cnt-1] = li_Ticket;
            OrderSelect (li_Ticket, SELECT_BY_TICKET);
            ldt_Time = OrderCloseTime();
        }
        else break;
    }
//----
    return (li_cnt);
}

调用 fGet_TicketsLastCloseOrd()函数 并返回根据指定参数找到的票数后,你可以(我会这样做)用指定的票数(fi_NUM)和函数返回的值进行检查。所有收集到的票据将在数组中通过引用传递给函数。

而在这个变体中,搜索到多少张最后的门票并不重要。:)

而如果你需要通过这些最后关闭的订单获得利润,那就更容易了。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция получает Profit N последних закрытых ордеров                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_ProfitLastCloseOrd (int fi_NUM,          // Количество просчитываемых ордеров
                                int fi_Type = -2)    // OrderType()
{
    int      li_Ticket;
    double   ld_Profit = 0.;
    datetime ldt_Time = 0;
//----
    for (int li_IND = 0; li_IND < fi_NUM; li_IND++)
    {
        li_Ticket = fGet_TicketLastClosePos (fi_Type, 0, ldt_Time);
        if (li_Ticket > 0)
        {
            OrderSelect (li_Ticket, SELECT_BY_TICKET);
            ldt_Time = OrderCloseTime();
            ld_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
        }
        else break;
    }
//----
    return (ld_Profit);
}
 
TarasBY:

这里是搜索最后关闭订单的N张票的可能方式之一,你可以通过类型(买入,卖出)和盈利能力(亏损,盈利)来过滤订单。

在调用fGet_TicketsLastCloseOrd()函数并返回根据指定参数找到的票数后,你可以(我会这样做)用指定的票数(fi_NUM)和函数返回的值进行检查。所有收集到的票据将在数组中通过引用传递给函数。

而在这个变体中,搜索到多少张最后的门票并不重要。:)

而如果你需要通过这些最后关闭的订单获得利润,那就更容易了。



非常感谢,我先休息一下,我需要弄清楚什么是...
 
你好,请帮我解决这个问题:我想用一个指标来显示欧元币值、美元指数和欧元指数,但它们的数值相差好几阶。我怎样才能使它们的价值达到相同的顺序?只是增加了乘数 - 我不认为它适合我的口味......
 
tommy27:
你好,请帮我解决这个问题:我想用一个指标来显示欧元币值、美元指数和欧元指数,但它们的数值相差好几阶。我怎样才能使它们的价值达到相同的顺序?我认为增加乘法器是不可行的...

将所有指标的最小值和最大值设置为相同的值
 

您好,我给专家的建议:我写了一个指标,我想在我的EA中使用这个信号。指示器功能和转移的指示器,哪一个会工作得更快?

谢谢

 
pako:

将所有指标的最小值和最大值设置为相同

哪些人...我希望所有这些都能通过一个指标显示出来,用于3个垂线缓冲区。
 

tommy27:

你如何使它们达到相同顺序的价值?

规模必须相同
 
pako:
规模应该是一样的

是的,为了做到这一点,在像这样显示之前,转换所有三个缓冲区的数值是有意义的。

Xn=(X-Xmin)/(Xmax-Xmin)。

如果你直截了当地这样做,你得到的东西看起来像一条水平线

好吧,如果你使用MQ的缩放比例,你就可以了。

 
谢谢,我会试一试的。
 
Zhunko:
如果它真的发生了,也不会很快发生,也许永远不会。

谢谢你的答复。

但我在其他代码中使用同样的可疑比较已经有很长一段时间了。

而且它成功地发挥作用。

int start()                                                                                                                     
{                                                                                                                       
                                                                                                                        
 double Price=iOpen (Symbol (),0,0);                                                                                                                            
 int last_order_bar = 0;                                                                                                                        
 int ot = OrdersTotal();                                                                                                                        
                                                                                                                        
 if (ot>0) //если есть ордера в рынке                                                                                                                   
 {                                                                                                                      
   if (OrderSelect (ot-1,SELECT_BY_POS))                                                                                                                        
      if (OrderType ()==OP_BUY || OrderType ()==OP_SELL )                                                                                                                       
         last_order_bar = iBarShift (Symbol (),0,OrderOpenTime ());                                                                                                             
 }                                                                                                                      
                                                                                                                        
 int last_hist_order_bar = 0;                                                                                                                   
 int oht = OrdersHistoryTotal();                                                                                                                        
                                                                                                                        
 if (oht>0)                                                                                                                     
 {                                                                                                                      
   if (OrderSelect (oht-1,SELECT_BY_POS, MODE_HISTORY))                                                                                                                         
      if (OrderType ()==OP_BUY || OrderType ()==OP_SELL)                                                                                                                        
         last_hist_order_bar = iBarShift (Symbol (),0,OrderOpenTime ());                                                                                                        
 }                                                                                                                      
                                                                                                                        
 if (ot==0 || last_order_bar>0)                                                                                                                      
    if (oht==0 || last_hist_order_bar>0) 
//===============================================================
if(Bid==Price)
if((Minute( ) ==45)&&(Minute( ) <50))
int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,1,Bid-1500*Point,Bid+150*Point,"jfh",123 );        
                                                                                        
}                                                                                                                       
return;
我不明白为什么这个条件在最后一种情况下不起作用。我没有看到这些代码之间有任何根本性的差异。