Open Forex4you Account

Server รัน EA 1000 / ปี

สั่งชื้อคู่มือการโปรแรกม MQL4

Author Topic: ถาม: การCloseOrder แบบ First In First Out  (Read 12327 times)

phoenicis

  • Newbie
  • *
  • Posts: 27
ถาม: การCloseOrder แบบ First In First Out
« on: กรกฎาคม 20, 2012, 09:22:40 am »
คือถ้า 1 บัญชีเปิดเปิด EA หลายตัว(หลาย Magic Number)

แล้วถ้าต้องการเขียนปิด Order ทั้งหมดโดยเรียงตามลำดับทั้งน้อยไปมาก และ มากไปน้อยต้องทำไงครับ

อย่าง มากไปน้อยผมพอทำได้
Code: [Select]
                    int total = OrdersTotal();
                    for (int i = total - 1; i >= 0; i--)
                    {
                        if (OrderSelect(i, SELECT_BY_POS))
                        {
                            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
                            {

                                RefreshRates();
                                int ticket = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(OrderClosePrice(), Digits), Slippage, Red);
                                if (ticket > 0)
                                {
                                    Print("Order : ", OrderTicket(), " closed by group order take profit : ", TakeProfitPercentage, " % ($", DoubleToStr(val1, 2), " /$", DoubleToStr(gi57640, 2), ")");
                                }
                                else Print("Error close order : ", GetLastError());

                            }
                        }
                    }

แต่ปิดจากลำดับน้อยไปมากนี่ผมคิดไม่ออกอ่ะครับ

มีใครพอเข้าใจแล้วพอช่วยได้บ้าง

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: ถาม: การCloseOrder แบบ First In First Out
« Reply #1 on: กรกฎาคม 20, 2012, 10:14:48 am »
FIFO มันต้องเรียงตาม TicketNumber ครับ อันไหนเปิดก่อนต้องปิดก่อน

phoenicis

  • Newbie
  • *
  • Posts: 27
Re: ถาม: การCloseOrder แบบ First In First Out
« Reply #2 on: กรกฎาคม 20, 2012, 11:23:03 am »
ขอบคุณครับได้ล่ะครับไปหาใน Google มา ^^

Code: [Select]
            if (FIFO)
            {
                // Create an array to hold the tickets of open orders. The following code could
                // be changed to that it also includes pending orders.
                int TradeList[][2];
                int ctTrade = 0;
                int i = 0;
                // Loop through the list of open orders, adding orders to TradeList if they are filled rather than pending
                for (i = 0; i < OrdersTotal(); i++)
                {
                    OrderSelect(i, SELECT_BY_POS);
                    switch (OrderType())
                    {
                        case OP_BUY:
                        case OP_SELL:
                            // Resize the array
                            ctTrade++;
                            ArrayResize(TradeList, ctTrade);
                            // Put the open time in [x][0] and the ticket in [x][1]
                            TradeList[ctTrade - 1][0] = OrderOpenTime();
                            TradeList[ctTrade - 1][1] = OrderTicket();
                            break;
                        default:
                            // Pending order. Ignore.
                            break;
                    }
                }
                // Sort the array. This sorts on [x][0], therefore ordering the array
                // in ascending order of open time. After this [0][0] holds the first open-time,
                // and [0][1] holds the corresponding ticket number
                ArraySort(TradeList, WHOLE_ARRAY, 0, MODE_ASCEND);
                // It's now possible to loop through the array doing something with
                // the tickets (and without needing to worry about the effect
                // on ctTrade of closing orders etc)
                i = 0;
                for (i = 0; i < ctTrade; i++)
                {
                    if (OrderSelect(TradeList[i][1], SELECT_BY_TICKET))
                    {
                        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
                        {
                            RefreshRates();
                            int ticket = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(OrderClosePrice(), Digits), Slippage, Red);
                            if (ticket > 0)
                            {
                                Print("Order : ", OrderTicket(), " closed by group order take profit : ", TakeProfitPercentage, " % ($", DoubleToStr(val1, 2), " /$", DoubleToStr(gi57640, 2), ")");
                            }
                            else Print("Error close order : ", GetLastError());
                        }
                    }
                }
            }

phoenicis

  • Newbie
  • *
  • Posts: 27
Re: ถาม: การCloseOrder แบบ First In First Out
« Reply #3 on: กรกฎาคม 23, 2012, 11:52:14 am »
มีปัญหาเพิ่มครับ ตามโคดข้างบน เกิด Error นี่ครับ

: incorrect start position 0 for ArraySort function

แต่การทำงานปกติดีครับ ปิดเรียงเหมือนเดิมแต่ขึ้น Error

มีวิธีแก้ไหมครับ ^^