[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 397

 
lottamer:

うまくいった!正直、ORをANDに代えるという発想はあったのだが・・・・。

ありがとうございます!ロジックは理解できましたが、閉じたものを15個数えるには、コードを風船サイズに膨らませなければなりませんね。

すべて1つのループにまとめることができますか? そして、必要な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)と関数が返す値でチェックすることが可能です。収集されたチケットはすべて、関数に参照渡しされる配列に入ります。

そして、このバリエーションでは、この最後のチケットが何枚検索されるかは重要ではありません。:)

そして、この最後のクローズド・オーダーによる利益が必要な場合は、さらに簡単です。



ありがとうございました。 少し休憩して、何が何だか考えないと...。
 
こんにちは、この問題を解決するのを助けてください:私は1つのインジケータがユーロバックス、ドルインデックスとユーロインデックスを表示したいのですが、それらの値はいくつかの順序で異なっています。同じ順番の値に持っていくにはどうしたらいいのでしょうか?ただ、倍率を上げるのは......私の趣味に合わないと思うのですが......。
 
tommy27:
こんにちは、この問題を解決するのを助けてください:私は1つのインジケータがユーロバックス、ドルインデックスとユーロインデックスを表示したいのですが、それらの値はいくつかの順序で異なっています。同じ順番の値に持っていくにはどうしたらいいのでしょうか?倍率をつけるのは無理があると思うのですが...。

すべてのインジケータの最小値と最大値を同じにする
 

プロへのアドバイス:私は私のEAで使用したいシグナルをインジケータを書いた あなたに良い一日。インジケーター機能と転送されたインジケーター、どちらが早く動作するのでしょうか?

感謝

 
pako:

すべてのインジケータの最小値と最大値を同じにします。

どれが...3つのドロラインバッファに対して、1つのインジケータで全てを表示させたい。
 

tommy27:

同じ順番の価値観に持っていくにはどうしたらいいのでしょうか?

一尺一寸
 
pako:
スケールは同じであるべきです

そうです。そのためには、3つのバッファ値をすべて変換してから、このように表示するのが理にかなっています。

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;
最後のケースで、なぜこの条件が機能しないのか理解できません。これらのコードに根本的な違いはないと思います。