Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: เกี่ยวกับการทำงานของ Loop + ความเร็วในการส่งข้อมูล  (Read 12181 times)

veronika

  • Newbie
  • *
  • Posts: 44
มีคำถามครับ ระหว่างการทำงานของ for loop ทั้ง 2 แบบ แบบไหนจะทำงานเร็วกว่า


แบบที่ 1

Code: [Select]
void Test Loop()
  {
   int i;
   double TakeProfitBuy;
  
   TakeProfitBuy = CalculateBuyProfit();
//----  
      if(CountBuy()>=1){
         for(i=0;i<=OrdersTotal();i++){
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA){
               if(OrderType()==OP_BUY){              
              
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitBuy,0,Lime);
               }
            }
         }
      }
      if(CountBuy()>=2){
         for(i=OrdersTotal();i>=0;i--){
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA){
               if(OrderType()==OP_BUY){              

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitBuys,0,Lime);
               }
            }
         }
      }      
  }

กับแบบที่ 2

Code: [Select]
void Test Loop1()
  {
   int i;
   double TakeProfitBuy;
  
   TakeProfitBuy = CalculateBuyProfit();
//----  
      if(CountBuy()>=1){
         for(i=0;i<=OrdersTotal();i++){
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA){
               if(OrderType()==OP_BUY){              
              
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitBuy,0,Lime);
               }
            }
         }
      }    
  }

void Test Loop2()
  {
   int i;
   double TakeProfitBuy;
  
   TakeProfitBuy = CalculateBuyProfit();
//----  
      if(CountBuy()>=2){
         for(i=OrdersTotal();i>=0;i--){
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA){
               if(OrderType()==OP_BUY){              

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitBuys,0,Lime);
               }
            }
         }
      }      
  }

ในกรณีที่มี Order เยอะ ตั้งการจะ Modify ทั้งชุด 10-15 order ขึ้นไป
** สังเกตุ ตรง Loop จะทำงานแบบ นับจากต้นไป ท้าย กับอีกอัน นับจากท้ายไปต้น

แบบไหนจะส่งข้อมูลไปหา Broker ได้เร็วกว่า อันนี้ไม่นับกับความเร็วเน็ตนะครับ แค่อยากทราบ ว่าแบบที่ผมแยกเป็น Method กับ ทำ Loop ใน method เดียว อันไหนจะเร็วกว่า

ขอบคุณครับ

ps. ถ้าจำไม่ผิด รู้สึกว่า แบบที่ 1 จะช้ากว่ารึป่าว เพราะการทำงานบน Mt4 มันจะทำแบบ บน ลงล่าง หรือว่าผมคิดไปเอง -..-

Edit : เพิ่มภาพประกอบการทำงาน

 :) :) :) :) :) :) :) :) :) << แทนจำนวน order

เริ่ม Modify จาก Loop แรก >>>>>>> :) :) :) :) :) :) :) :) :) <<<<<< เริ่ม Modify จาก Loop 2

ครบหมดก็เสร็จ
« Last Edit: สิงหาคม 23, 2013, 06:45:55 am by veronika »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ถ้าถามว่า แบบไหนจะส่งข้อมูลไปหา Broker ได้เร็วกว่า  อันนี้ตอบได้เลยว่าพอมันเริ่มต้นส่งก็เร็วเท่ากัน  แต่ผมส่งสัย ทำไมมีเงื่อนไขที่มันทับซ้อนกันครับ

CountBuy()>=1  กับ CountBuy()>=2   แบบนี้มันทำงานสองครั้งนะครับ แบบ แรกจะจำทำงานจบช้ากว่า แบบ ที่สอง เพราะแบบแรกมีเงื่อนไขสองชุด แต่ แบบ ที่สองคุณ แบ่งเป็นฟังก์ชั่น  ซึ่งจริงเงื่อนไข CountBuy()>=1  มันครอบคลุม เงื่อนไขที่สองด้วยนะครับ CountBuy()>=2   เพราะเงื่อนไขแรกหมายความว่า มากว่าหรือเท่ากับ 1  เงื่อนไขที่สองหมายความว่า มากกว่าหรือเท่ากับ 2  ยังไงเงื่อนไขแรกก็ทำงานครอบเงื่อนไขที่สองอยู่ดีครับ  อีกเรื่องเขียนการ Modify โดยไม่มีการ Sleep รอโบรเกอร์มัน Modify Order จะทำให้โบรเกอร์รับงานเราไปแก้ไขได้ไม่หมดในการวน loop ครั้งเดียว EA ต้องทำการส่งซ้ำ ซึ่งจะใช้เวลาในการแก้ไขทั้งหมดช้าลง

veronika

  • Newbie
  • *
  • Posts: 44
ขอบคุณมากครับ เจอปัญหาตรงที่มัน Modify ไม่ทันนี่ล่ะครับ  ;D

Edit : อีกอย่างครับ ถ้าเกิดผมใช้แบบแรกโดยเงื่อเข Count>=1 แต่ใส่ 2 for ตัวนี้จะเร็วพอๆกับแบบที่ 2 มั้ยครับ หรือช้ากว่าอยู่ดี

ps. เดี๋ยวไปใส่ delay เพิ่มอีกที ซัก 1-2 วิ
« Last Edit: สิงหาคม 23, 2013, 01:18:48 pm by veronika »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ใช้ LOOP เดียวพอครับ เพราะโบรเกอร์มันทำงานทีละคำสั่งครับ คำสั่งแรกทำงานจบถึงทำงานต่อคำสั่งที่สองครับ ถ้าเราใส่ loop เยอะมันส่งไปมาก เดียวจะเกิดอาการค้างที่โบรเกอร์ครับคือส่งไปแล้วไม่ตอยสนองต่อรอเป็นนาทีกว่าจะทำงานต่อไปได้นะครับ

veronika

  • Newbie
  • *
  • Posts: 44
ขอบคุณสำหรับคำแนะนำครับ  ;)