COCO研究院

 找回密碼
 註冊
搜索
查看: 4389|回復: 7

請教無大 關於MT4

[複製鏈接]
發表於 12-3-30 23:04 | 顯示全部樓層 |閱讀模式
無無明大您好:

      感謝您的文章分享
      由於學習的過程中不斷出現問題
      又有幾個關於MT4的問題請教
      
      1. mt4 的部分能否部分平倉
          例如:
           一口30 lot的多單
           可否平其中3 lot變成27lot

      2. 為了部分平倉
          曾試著將上述問題改成
          10口 3 lot 多單
          但在程式執行後(用迴圈)
          可能變成 成交5口
          下一個tick 成交4口
          再下一個tick 成交1口
          這在多轉空 或 空轉多時,
          倉位容易錯誤

        麻煩明大了
        thank you

發表於 12-3-31 08:48 | 顯示全部樓層
可以 部分平倉,只要是 MT4 就可以 多空 同時存在。
(註:MT5 不行)
多空倉位同步存在後,有指令可以 一對一 多空沖銷。
例如:
1筆單 2口空單 序號:1234
1筆單 10口多單 序號:5678

1234 對 5678 沖銷後
剩下 8口 多單

不管是 是 手工沖銷 或用程式沖銷 多可以。

在 script 裡面就有
 樓主| 發表於 12-3-31 13:35 | 顯示全部樓層
感謝明大

            再請教
            如您舉的例子,我可否在擁有一筆10口多單的情形下,用程式幫我平其中2口,剩下8口多單(這樣可以省點手續費)

            另外原始文章中我舉的問題2不知明大是否遇過,或如何解決
            我實在想不出合理的解釋原因

            再次感謝
 樓主| 發表於 12-4-3 17:09 | 顯示全部樓層
明大:
             測試結果的確可以平部分單
             但平完部分倉位之後的單
             程式去抓  抓不到單
             出現 error code: 4099  ERR_END_OF_FILE (4099)
           是我的orderclose語法有問題嗎?
             或是要如何才能避開此問題?

            while(市場倉位 > 訊號倉位)
           {  
             if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
             {
              if(需要倉位>=OrderLots()) send_lot=OrderLots();
               else                                 send_lot=abs_pos;
            
              if(OrderType()==OP_BUY && OrderComment()==signal)
                {OrderClose(OrderTicket(),send_lot,Bid,slip,Blue);}
             cnt++;
             市場倉位=市場倉位 - send_lot;
             }


        懇求賜教
發表於 12-4-3 19:02 | 顯示全部樓層
double longpos,shortpos;
//#property show_confirm
void Wait()
{
   while( IsTradeContextBusy() )
   {
      Sleep(5);
   }
}
//+------------------------------------------------------------------+
//| script "close first market order if it is first in the list"     |
//+------------------------------------------------------------------+
double NetPos()
{   
   int total = OrdersTotal();
   static double current_Pos,BuyPos,SelPos;
   current_Pos=0;  BuyPos=0;  SelPos=0;
   for(int cnt=0; cnt<total; cnt++)
   {        
     OrderSelect(cnt, SELECT_BY_POS);            
     if(OrderSymbol() == Symbol()&&OrderType()==OP_BUY)
        BuyPos=BuyPos+OrderLots();
     if(OrderSymbol() == Symbol()&&OrderType()==OP_SELL)   
        SelPos=SelPos+OrderLots();
   }
   current_Pos=BuyPos-SelPos;
   longpos=BuyPos;
   shortpos=SelPos;
   return (current_Pos);
}
int start()
{
   bool   result;
   double price;
   int    BuyTick,SellTick,cnt1,cnt2,total;
//----
   double net = NetPos();
if( net > 0)
{  
   while(shortpos>0)
   {
     total = OrdersTotal();
     for (cnt1=0;cnt1<total;cnt1++)
     {    OrderSelect(cnt1, SELECT_BY_POS);   
          if (OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
          {  
             BuyTick=OrderTicket();
             for (cnt2=0;cnt2<total;cnt2++)
             {    OrderSelect(cnt2, SELECT_BY_POS);
                  if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
                  {
                    SellTick=OrderTicket();
                    Wait();
                    RefreshRates();
                    OrderCloseBy(BuyTick,SellTick);
                  }
             }        
          }
      }
      net = NetPos();
   }
} else
if( net < 0 )
{
   while(longpos>0)
   {
     total = OrdersTotal();
     for (cnt1=0;cnt1<total;cnt1++)
     {    OrderSelect(cnt1, SELECT_BY_POS);   
          if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
          {  
             SellTick=OrderTicket();
             for (cnt2=0;cnt2<total;cnt2++)
             {    OrderSelect(cnt2, SELECT_BY_POS);
                  if (OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
                  {
                    BuyTick=OrderTicket();
                    Wait();
                    RefreshRates();
                    OrderCloseBy(SellTick,BuyTick);
                  }
             }        
          }
      }
      net = NetPos();
   }
}  else
  return(0);
}

從這個範例,你所要認知的是:
1、多單 10 口
2、建立 空單2口
3、此時 淨多單8口
4、採用 OrderCloseBy(SellTick,BuyTick); 去沖銷

反之,淨空單 8口
採用 OrderCloseBy(BuyTick,SellTick);
 樓主| 發表於 12-4-3 19:41 | 顯示全部樓層
本帖最後由 wprstyle 於 12-4-3 20:13 編輯

明大:

    原來我一直走錯路

    感謝賜教

    若延申您舉的例子,
          10->8->0
          多單十口 => 10口手續費
          空單兩口 => 2口手續費
          多空互抵
  最後多單八口全平
                          共12口手續費

    有無可能
    多單十口     => 10口手續費
    平其中兩口
  最後平剩下八口
                           共10口手續費

    因為手續費還蠻貴的
    希望省一點手續費
    謝謝
發表於 12-4-3 21:13 | 顯示全部樓層
MT4 交易 並沒有手續費
觀念上 有偏差
 樓主| 發表於 12-4-6 10:40 | 顯示全部樓層
明大:

          多謝指正, 豁然開朗

          再次感謝
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-12-22 20:11

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |