Advertisement
Guest User

Untitled

a guest
Aug 20th, 2018
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.13 KB | None | 0 0
  1. //+------------------------------------------------------------------+
  2. //|                                               nariyuki_entry.mq4 |
  3. //|                        Copyright 2018, MetaQuotes Software Corp. |
  4. //|                                             https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2018, MetaQuotes Software Corp."
  7. #property link      "https://www.mql5.com"
  8. #property version   "1.00"
  9. #property strict
  10.  
  11. #include <stdlib.mqh>
  12.  
  13. double Now_Price      = 0;  // 現在価格
  14. double Last_EntryL     = 0;  // 最終エントリー価格L
  15. double Last_EntryS     = 0;  // 最終エントリー価格S
  16. input double Lots = 0.01; // ロットサイズ
  17. input int Sleppage = 3;  // 許容スリッページ
  18. input double Scale = 0.1; //ピラミッティング幅
  19. int TicketL = 0;//チケット番号
  20. int TicketS = 0;//チケット番号
  21. bool   retB = false;//変数retB(一旦判断する基準の変数をOffとする)という意味
  22. input double LossCutRangePips = 10.0;   //  損切り幅(Pips)
  23.  
  24.  
  25.  
  26.  
  27. //+------------------------------------------------------------------+
  28. //| Expert initialization function                                   |
  29. //+------------------------------------------------------------------+
  30. int OnInit()
  31.   {
  32.  
  33.    
  34. //---
  35.    
  36. //---
  37.    return(INIT_SUCCEEDED);
  38.   }
  39. //+------------------------------------------------------------------+
  40. //| Expert deinitialization function                                 |
  41. //+------------------------------------------------------------------+
  42. void OnDeinit(const int reason)
  43.   {
  44. //---
  45.    
  46.   }
  47. //+------------------------------------------------------------------+
  48. //| Expert tick function                                             |
  49. //+------------------------------------------------------------------+
  50. void OnTick()
  51.   {
  52.  
  53.      // 本足始値取得
  54.     Now_Price = ((Ask+Bid)/2);//ポジの保有時
  55.    
  56.    
  57.     if(TicketL==0)//ポジションLが0の場合
  58.    {
  59.     TicketL = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,0,0);//買いを成り行き注文
  60.     Last_EntryL = Now_Price;
  61.    }
  62.  
  63.  
  64.     if(TicketS==0)//ポジションSが0の場合
  65.    {
  66.     TicketS = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,0,0);//売りを成り行き注文
  67.     Last_EntryS = Now_Price;
  68.    }
  69.    
  70.      
  71. //-------------------------------------------------------------------------------------------    
  72.     //Lのピラミッティング主要
  73.      if(Now_Price - Last_EntryL >= Scale)// Scale値以上上昇している場合
  74.     {
  75.      TicketL = OrderSend(_Symbol,OP_BUY,Lots,Ask,Sleppage,0,0,NULL,0,0,clrRed);//Lをピラミ
  76.      Last_EntryL = Now_Price;//前回のエントリー値を今のエントリー値に書き代える
  77.     }
  78. //----------------------------------------------------------------------------------------------    
  79.     //Sのピラミッティング主要
  80.     else if(Last_EntryS - Now_Price >= Scale)// Scale値以上下降している場合
  81.     {
  82.      TicketS = OrderSend(Symbol(), OP_SELL, Lots, Bid, Sleppage, 0, 0, NULL, 0, 0, clrBlue);// Sをピラミッティング
  83.      Last_EntryS = Now_Price;//前回のエントリー値を今のエントリー値に書き代える
  84.     }
  85.  //-------------------------------------------------------------------------------------------------  
  86.     {
  87. //---
  88.     //  ----------------------------------------
  89.     //  LとSのポジション毎にポジションの平均レートを算出する
  90.     //  ----------------------------------------
  91.    
  92.     double buyRatesTotal = 0;   //  買いポジションレートの合計(ロット数考慮)
  93.     double sellRatesTotal = 0;  //  売りポジションレートの合計(ロット数考慮)
  94.    
  95.     double buyPositionLots = 0;     //  買いポジションの数
  96.     double sellPositionLots = 0;    //  売りポジションの数
  97.    
  98.     //  ポジションの数と合計したレート合計を算出
  99.     for(int i = OrdersTotal() -1; i >= 0; i--) {
  100.         //  オーダー選択失敗した場合は処理抜け
  101.         if(OrderSelect(i, SELECT_BY_POS) == false || OrderSymbol() != Symbol()) {
  102.             break;
  103.         }
  104.        
  105.         //  買いポジションの場合
  106.         if(OrderType() == OP_BUY) {
  107.             buyRatesTotal += OrderOpenPrice() * OrderLots();    //  買いレートを足し算
  108.             buyPositionLots += OrderLots();                     //  買いポジションのロット数を加算
  109.         }
  110.         //  売りポジションの場合
  111.         else if(OrderType() == OP_SELL) {
  112.             sellRatesTotal += OrderOpenPrice() * OrderLots();   //  売りのレートを足し算
  113.             sellPositionLots += OrderLots();                    //  売りポジションのロット数を加算
  114.         }
  115.         else {
  116.             //  Do Nothig
  117.         }
  118.     }
  119.    
  120.     //  レート合計 ÷ ポジションのロット数合計 = 平均レート
  121.    
  122.    
  123.    
  124.     //  現在レートを更新する
  125.     RefreshRates();
  126.    
  127.     //  ●●Pipsマイナスになったら損切る  --------------------------------------------------
  128.    
  129.     //  現在のAskとBidを保持(レート)
  130.     double ask = Ask;
  131.     double bid = Bid;
  132.    
  133.     //  現在レートをAskとBidの平均とする
  134.     double currentAverageRate = (ask + bid) / 2.0;
  135.     //  ロスカットのPipsからレートに変換
  136.     double lossCutRangeRate = PipsToRate(LossCutRangePips);
  137.    
  138.     //  -----
  139.     //  買いの損切り
  140.     if(buyPositionLots > 0) {
  141.         double averageBuyRate = buyRatesTotal / buyPositionLots;        //  買いポジション平均レート
  142.         if(currentAverageRate < (averageBuyRate - lossCutRangeRate)) {
  143.             CloseALLPosition(OP_BUY);
  144.         }
  145.     }
  146.     //  売りの損切り
  147.     else if(sellPositionLots > 0) {
  148.         double averageSellRate = sellRatesTotal / sellPositionLots; //  売りポジション平均レート
  149.         if(currentAverageRate > (averageSellRate + lossCutRangeRate)) {
  150.            CloseALLPosition(OP_SELL);
  151.         }
  152.     }
  153.    
  154.   }
  155. }
  156. //+------------------------------------------------------------------+
  157.  
  158. //  引数して指定した方向のポジションをすべて閉じる
  159. void CloseALLPosition(int orderType) {
  160.     double price;   //  ポジションを閉じるときのレート
  161.     if(orderType == OP_BUY) {
  162.         price = Bid;
  163.     }
  164.     else if(orderType == OP_SELL) {
  165.         price = Ask;
  166.     }
  167.     else {
  168.         Print("{609F7007-6D2B-4AD4-ADAA-ABA829E1F958}");
  169.         return;
  170.     }
  171.  
  172.     for(int i = OrdersTotal() -1; i >= 0; i--) {
  173.         //  オーダーの選択が出来なかった場合は何らかの問題があるから処理抜け
  174.         if(OrderSelect(i, SELECT_BY_POS) == false) {
  175.             break;
  176.         }
  177.        
  178.         //  ポジションがクロースするポジションの方向と一致する場合
  179.         if(OrderType() == orderType) {
  180.             bool success = OrderClose(OrderTicket(), OrderLots(), price, Sleppage);
  181.            
  182.             //  オーダークローズに失敗した場合はエラーメッセージだけ表示してなにも対応しない
  183.             if(success == false) {
  184.                 Print(ErrorDescription(GetLastError()));    //  エラーメッセージの表示(英語)
  185.                 //  TODO    本来はエラー処理を実行する
  186.             }
  187.         }
  188.         //  ポジションがクロースするポジションの方向と一致しない場合は次のチケットへ
  189.         else {
  190.             continue;
  191.         }
  192.     }
  193.     //  [TODO] 注文失敗したときのエラー処理未実装
  194. }
  195.  
  196.  
  197. double PipsToRate(double pips) {
  198.     if(pips < 0) {
  199.         //  あまり好きではないが、マイナスの値で返す
  200.         return -1;
  201.     }
  202.    
  203.     switch(Digits) {
  204.         case 2:
  205.         case 3:
  206.             return pips * 0.01;
  207.         case 4:
  208.         case 5:
  209.             return pips * 0.0001;
  210.         default:
  211.             //  あまり好きではないが、マイナスの値で返す
  212.             return -1;
  213.     }
  214. }
  215.    
  216.    
  217. //+------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement