wprstyle 發表於 12-3-30 23:04

請教無大 關於MT4

無無明大您好:

      感謝您的文章分享
      由於學習的過程中不斷出現問題
      又有幾個關於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 裡面就有

wprstyle 發表於 12-3-31 13:35

感謝明大

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

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

            再次感謝

wprstyle 發表於 12-4-3 17:09

明大:
             測試結果的確可以平部分單
             但平完部分倉位之後的單
             程式去抓抓不到單
             出現 error code: 4099ERR_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);

wprstyle 發表於 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 交易 並沒有手續費
觀念上 有偏差

wprstyle 發表於 12-4-6 10:40

明大:

          多謝指正, 豁然開朗

          再次感謝
頁: [1]
查看完整版本: 請教無大 關於MT4