Advertisement
Guest User

Untitled

a guest
Aug 20th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.20 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. if(true) { // nobuhiko
  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. TicketL = 0;
  145. }
  146. }
  147. // 売りの損切り
  148. else if(sellPositionLots > 0) {
  149. double averageSellRate = sellRatesTotal / sellPositionLots; // 売りポジション平均レート
  150. if(currentAverageRate > (averageSellRate + lossCutRangeRate)) {
  151. CloseALLPosition(OP_SELL);
  152. TicketS = 0;
  153. }
  154. }
  155.  
  156. }
  157. }
  158. //+------------------------------------------------------------------+
  159.  
  160. // 引数して指定した方向のポジションをすべて閉じる
  161. void CloseALLPosition(int orderType) {
  162. double price; // ポジションを閉じるときのレート
  163. if(orderType == OP_BUY) {
  164. price = Bid;
  165. }
  166. else if(orderType == OP_SELL) {
  167. price = Ask;
  168. }
  169. else {
  170. Print("{609F7007-6D2B-4AD4-ADAA-ABA829E1F958}");
  171. return;
  172. }
  173.  
  174. for(int i = OrdersTotal() -1; i >= 0; i--) {
  175. // オーダーの選択が出来なかった場合は何らかの問題があるから処理抜け
  176. if(OrderSelect(i, SELECT_BY_POS) == false) {
  177. break;
  178. }
  179.  
  180. // ポジションがクロースするポジションの方向と一致する場合
  181. if(OrderType() == orderType) {
  182. bool success = OrderClose(OrderTicket(), OrderLots(), price, Sleppage);
  183.  
  184. // オーダークローズに失敗した場合はエラーメッセージだけ表示してなにも対応しない
  185. if(success == false) {
  186. Print(ErrorDescription(GetLastError())); // エラーメッセージの表示(英語)
  187. // TODO 本来はエラー処理を実行する
  188. }
  189. }
  190. // ポジションがクロースするポジションの方向と一致しない場合は次のチケットへ
  191. else {
  192. continue;
  193. }
  194. }
  195. // [TODO] 注文失敗したときのエラー処理未実装
  196. }
  197.  
  198.  
  199. double PipsToRate(double pips) {
  200. if(pips < 0) {
  201. // あまり好きではないが、マイナスの値で返す
  202. return -1;
  203. }
  204.  
  205. switch(Digits) {
  206. case 2:
  207. case 3:
  208. return pips * 0.01;
  209. case 4:
  210. case 5:
  211. return pips * 0.0001;
  212. default:
  213. // あまり好きではないが、マイナスの値で返す
  214. return -1;
  215. }
  216. }
  217.  
  218.  
  219. //+------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement