กองทุน SPDR GOLD SHARES
ถือทองก่อนหน้า
ถือทองล่าสุด
0.00
*หน่วยตัน / ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
สถิติกองทุน SPDR
ราคาทองคำแท่ง 96.5%
ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
ครั้งที่
ราคาก่อนหน้า
ราคาล่าสุด
0
(หน่วย บาท*) / อัปเดตล่าสุดเมื่อวันที่ 13 ก.ค. 2566 เวลา 13:04 น.
สถิติราคาทองคำ ไทย

การแก้ Lots size สำหรับบัญชีเซนต์

  • 9 replies
  • 3,235 views
การแก้ Lots size สำหรับบัญชีเซนต์
« เมื่อ: 14, มิถุนายน 2019, 08:55:09 PM »
ขอคำชี้แนะจากท่านด้วยครับ แก้ไม่ได้จริงๆ ครับ บัญชีไมโคร เปิดด้วยมือ 0.01 เปิดได้แต่พอให้อีเอเปิด ไม่ได้ครับขึ้น error 131
ลองเช็คค่า  MODE_MINLOT แล้วก็ได้ 0.01 แก้ไม่ถูกจริง ๆ ครับ ท่านช่วยดูโค๊ดนี้ให้ผมหน่อยนะครับ ขอขอบคุณล่วงหน้ามากมากครับท่าน

//+------------------------------------------------------------------+
//|                                                                          LD.MQ4  |
//|                       Copyright  2019 MetaQuotes Software Corp. |
//|                                                                                       |
//+------------------------------------------------------------------+
#property copyright "Copyright Gaothun 2019."

extern string EA_Name      = "";
extern int MagicNumber     = 111;
extern int  TakeProfit     = 999;
extern int  Step_Order     = 100;
extern double Lots         = 0.01;
extern double Step_Lots    = 1.5;
extern bool    Enable_TargetDollar  = True;
extern double  TargetDollar         = 1;
extern bool Enable_SL_Dollar = False;
extern int  SL_Dollar      = 999;
extern int  XDISTANCE      = 950;


int         OpenOrders=0, cnt=0;
int         mode=0, myOrderType=0;
int         slippage=5, LastType=0;
int         Stoploss = 0;
double      mylotsi=0;
double      sl=0, tp=0;
double      BuyPrice=0, SellPrice=0;
double      LastPriceBuy, LastPriceSell;
double      LastPriceBuyLimit;
double      LastPriceSellLimit;
double      LastPrice=0;
double      LastLots, LastLotsBuy, LastLotsSell;
double      Profit, Points;
bool        ContinueOpening=True;
double      NewPoint=Point();
double      B_LotPrice= 0;
double      B_Average = 0;
double      S_LotPrice= 0;
double      S_Average = 0;
double      B_Lot, S_Lot;

double      TPB, TPS;
int         B_bar,Bar ;
int         CountB, CountS;
int         CountBuyLimit, CountSellLimit;
int         result, ticket;
bool        res,tic;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
//----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---------------
//---------------

   OpenOrders    = 0;
   LastType      = 0;
   LastPriceSell = 0;
   LastPriceBuy  = 0;
   LastLotsBuy   = 0;
   LastLotsSell  = 0;
   LastLots      = 0;
   Profit        = 0;
   CountB        = 0;
   CountS        = 0;
   NewPoint       = Point();
   B_LotPrice     = 0;
   B_Average      = 0;
   S_LotPrice     = 0;
   S_Average      = 0;
   B_Lot          = 0;
   S_Lot          = 0;
   
   for(cnt=0;cnt<OrdersTotal();cnt++)   
   {
     result = OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
     {            
        LastPrice=OrderOpenPrice();
        LastLots=OrderLots();
          OpenOrders++;
          Profit += OrderProfit();
        if (OrderType()==OP_BUY) 
        {
            LastType=OP_BUY;
            CountB++;
              LastPriceBuy = OrderOpenPrice();
              LastLotsBuy = OrderLots();
            B_Lot+=OrderLots();
            B_LotPrice+=OrderLots()*OrderOpenPrice();
        }
        if (OrderType()==OP_SELL)
        {
            LastType=OP_SELL;
            CountS++;
              LastPriceSell= OrderOpenPrice();
              LastLotsSell = OrderLots();
            S_Lot+=OrderLots();
            S_LotPrice+=OrderLots()*OrderOpenPrice();
        }
     }
   }     
//------------------------------------------------------Start open First order---------------------------------
double MinLots          = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLots          = MarketInfo(Symbol(),MODE_MAXLOT);

if (Lots<MinLots) {Lots=MinLots;}
if (Lots>MaxLots) {Lots=MaxLots;}

Comment ("Lots : ",Lots, " MinLots : ",MinLots," mylotsi : ",mylotsi);
if(ContinueOpening)
  {
   //-----------------------------------------------Pending Order SellLimit-----------
         if (Bid-LastPriceSell>=Step_Order*Point || CountS<1)
         {
             SellPrice=Bid;
             if (TakeProfit==0) { tp=0; }
             else { tp=SellPrice-TakeProfit*Point; }   
             if (Stoploss==0) { sl=0; }
             else { sl=SellPrice+Stoploss*Point;  }
             mylotsi=Lots;
             if (CountS>1)
             {
                  for(cnt=1;cnt<=CountS;cnt++)
                  {
                     LastLotsSell=mylotsi;
                     mylotsi=NormalizeDouble(LastLotsSell*Step_Lots,2);
                  }
             }       
             ticket = OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,tp,NULL,MagicNumber,0,clrRed);   
             return(0);
         }   
   //-----------------------------------------------Pending Order BuyLimit-----------
         if (LastPriceBuy-Ask>=Step_Order*Point || CountB<1)
         {
             BuyPrice=Ask;
             if (TakeProfit==0) { tp=0; }
             else { tp=BuyPrice+TakeProfit*Point; }   
             if (Stoploss==0)  { sl=0; }
             else { sl=BuyPrice-Stoploss*Point; }
             mylotsi=Lots;
             if (CountB>1)
             {
                  for(cnt=1;cnt<=CountB;cnt++)
                  {
                     LastLotsBuy=mylotsi;
                     mylotsi=NormalizeDouble(LastLotsBuy*Step_Lots,2);
                  }
             }       
             ticket = OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,tp,NULL,MagicNumber,0,clrBlue);         
             return(0);
         }   
  }
//-------------------------------------Cut OrderClose-----------------------------
//----------------------------------------------------------
if(OpenOrders!=0 && Profit>=TargetDollar && Enable_TargetDollar)
  {
     for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
        result = OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if (mode==OP_BUY)  {res =  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrDarkViolet); }
         if (mode==OP_SELL) {res =  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrOrangeRed); }
        }
     }
  }
if(OpenOrders!=0 && Profit<=(-SL_Dollar) && Enable_SL_Dollar)
  {
     for(cnt=0;cnt<OrdersTotal();cnt++)
     {
        result = OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          mode=OrderType();
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if (mode==OP_BUY) {ticket =  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrIndigo); }
         if (mode==OP_SELL){ticket =  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrCrimson); }
        }
     }
  }


//---------------------------------------------------------------------------------------------
//----------------------
//----
   return(0);
  }

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #1 เมื่อ: 14, มิถุนายน 2019, 10:59:03 PM »

ผมเดาเอานะ ลองแก้ดูเด๊่ยวก็ได้ครับ

ลอง comment ค่า  LastLotsBuy  กับ mylotsi  ออกมาดูด้วยนะครับ เพราะมันเป็นค่าที่ใช้งาน

ค่า LastLotsBuy กับ mylotsi  มันโดนรีเซ็ตค่าเป็น 0  เวลาออก order มามันน่าจะเป็น 0 lot เลยผิดหรือเปล่าครับ




Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #2 เมื่อ: 14, มิถุนายน 2019, 11:22:30 PM »
ปัญหาคือเอาไปใช้จริงกับแอคเค้าเซ็นต์ไม่ได้ใช่ใหมครับ

ผมลอง backtest ก็ได้นะ   ผมไม่ได้ใช้แอคเค้่า cent  พอจะมีรูปตอนมัน error ใหมครับ
demo มันเป็น standard ลองแล้วผ่านตลอด

ถ้า

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #3 เมื่อ: 15, มิถุนายน 2019, 09:58:26 AM »
อ้างจาก: forcebewithyou ที่ 14, มิถุนายน  2019, 11:22:30 PM
ปัญหาคือเอาไปใช้จริงกับแอคเค้าเซ็นต์ไม่ได้ใช่ใหมครับ

ผมลอง backtest ก็ได้นะ   ผมไม่ได้ใช้แอคเค้่า cent  พอจะมีรูปตอนมัน error ใหมครับ
demo มันเป็น standard ลองแล้วผ่านตลอด

ถ้า

ก่อนอื่นขอบคุณท่านมากมากนะครับที่ช่วยชี้แนะมา ผมได้ทำตามคำแนะนำแล้วนะครับ ได้ comment ค่า mylotsi และ lastlotbuy แล้ว ปรากกฏตามภาพเลย
ปัญหาก็คือมันรันบัญชีเซนต์ไม่ได้ครับ ขึ้นโค๊ด error 131 แต่ถ้ากำหนด lots เริ่มต้น = 0.1 ได้นะครับซึ่งตรงบัญชีนี้เคยเปิดมือแล้วเปิดขั้นต่ำ 0.01 ได้ รันอีเอตัวอื่นที่เปิดล็อต 0.01 ก็ได้ ก็เลยสงสัย แต่ถ้าเอาอีเอตัวนี้ไปรันบัญชีแสตนดาร์ด จะไม่มีปัญหาเลยครับท่าน

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #4 เมื่อ: 15, มิถุนายน 2019, 11:29:11 AM »
อีเอเป็น martingal นะครับ backtest แล้วหัวปักทุกที
ผมก็เห็นอีเอคนอื่นๆทำใช้งานใน micro xm ได้ปกตินะครับ
ให้ลองทดสอบว่า account cent ของ xm ใช้งานได้หรือเปล่า
ทำอีเอง่ายๆ จับลากให้ ออก order ที่ 0.01 ใน xm micro ครับ ถ้าได้ แสดงว่าค่าตัวแปรสักตัว น่าจะมีปัญหาครับ
เอาคำสั่ง basic ที่สุดเลย ถ้าผ่าน ก็แสดงว่าใช้อีเอได้นครับ


https://docs.mql4.com/trading/ordersend

void OnStart()
  {
//--- get minimum stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
   int ticket=OrderSend(Symbol(),OP_BUY,0.01,price,3,0,0,"My Test order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
//---
  }


อื่นๆ ลองสอบถามหลายๆที่ดูครับ เผื่อมีคนทำอยู่แล้เเจอปัญหาเดียวกันแล้วแก้ไขได้แล้ว

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #5 เมื่อ: 15, มิถุนายน 2019, 11:42:50 AM »
อ้างจาก: forcebewithyou ที่ 15, มิถุนายน  2019, 11:29:11 AM
อีเอเป็น martingal นะครับ backtest แล้วหัวปักทุกที
ผมก็เห็นอีเอคนอื่นๆทำใช้งานใน micro xm ได้ปกตินะครับ
ให้ลองทดสอบว่า account cent ของ xm ใช้งานได้หรือเปล่า
ทำอีเอง่ายๆ จับลากให้ ออก order ที่ 0.01 ใน xm micro ครับ ถ้าได้ แสดงว่าค่าตัวแปรสักตัว น่าจะมีปัญหาครับ
เอาคำสั่ง basic ที่สุดเลย ถ้าผ่าน ก็แสดงว่าใช้อีเอได้นครับ


https://docs.mql4.com/trading/ordersend

void OnStart()
  {
//--- get minimum stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
   int ticket=OrderSend(Symbol(),OP_BUY,0.01,price,3,0,0,"My Test order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
//---
  }


อื่นๆ ลองสอบถามหลายๆที่ดูครับ เผื่อมีคนทำอยู่แล้เเจอปัญหาเดียวกันแล้วแก้ไขได้แล้ว

ลองแล้วครับท่าน บัญชีไมโคร XM ไม่เปิดออร์เดอร์เลยลองเอาโค๊ดไปวางแล้วขึ้น error ตามภาพครับ

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #6 เมื่อ: 15, มิถุนายน 2019, 12:04:59 PM »
ดูในรูปแล้วมันต้องใช้กับคู่เงิน   EURUSDmicro นะครับ  มีตัวนี้ให้เลือกใหมครับ

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #7 เมื่อ: 15, มิถุนายน 2019, 12:11:26 PM »

มีคู่เงินนี้ให้ backtest ใหมครับ

backtest ถ้าใช้ tick data จากที่อื่นๆ ต้องเปลี่ยนชื่อด้วยนะครับ


แอคเค้าไมโครเทรด EURUSD ไม่ได้มั้งครับ   ต้องเป็น EURUSDmicro  มีให้เลือกหรือเปล่า

ผมปิดแอคเค้าไมโคร MT4 ไปหมดแล้วครับ ไม่มีให้ดูใช้แต่ MT4 standard กับ MT5

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #8 เมื่อ: 15, มิถุนายน 2019, 12:42:44 PM »
อ้างจาก: forcebewithyou ที่ 15, มิถุนายน  2019, 12:11:26 PM

มีคู่เงินนี้ให้ backtest ใหมครับ

backtest ถ้าใช้ tick data จากที่อื่นๆ ต้องเปลี่ยนชื่อด้วยนะครับ


แอคเค้าไมโครเทรด EURUSD ไม่ได้มั้งครับ   ต้องเป็น EURUSDmicro  มีให้เลือกหรือเปล่า

ผมปิดแอคเค้าไมโคร MT4 ไปหมดแล้วครับ ไม่มีให้ดูใช้แต่ MT4 standard กับ MT5

ขอบคุณครับผมลองเพิ่มคู่เงิน micro ตามภาพแล้วครับ แต่ตอนเบ็คเทสไม่มีคู่เงินไมโครเหมือนกันครับ

Re: การแก้ Lots size สำหรับบัญชีเซนต์
« ตอบกลับ #9 เมื่อ: 15, มิถุนายน 2019, 01:01:19 PM »
ขอบคุณท่านมากมากครับ ทำได้แล้วครับ คือตอนทดสอบต้องเลือกคู่เงินที่เป็น micro ด้วยเช่น EURUSDmicro

ตอนนี้ทดสอบได้แล้วครับ

(TH)** (TH)** (TH)** (TH)** (TH)**