Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //+------------------------------------------------------------------+
- //| nariyuki_entry.mq4 |
- //| Copyright 2018, MetaQuotes Software Corp. |
- //| https://www.mql5.com |
- //+------------------------------------------------------------------+
- #property copyright "Copyright 2018, MetaQuotes Software Corp."
- #property link "https://www.mql5.com"
- #property version "1.00"
- #property strict
- #include <stdlib.mqh>
- double Now_Price = 0; // 現在価格
- double Last_EntryL = 0; // 最終エントリー価格L
- double Last_EntryS = 0; // 最終エントリー価格S
- input double Lots = 0.01; // ロットサイズ
- input int Sleppage = 3; // 許容スリッページ
- input double Scale = 0.1; //ピラミッティング幅
- int TicketL = 0;//チケット番号
- int TicketS = 0;//チケット番号
- bool retB = false;//変数retB(一旦判断する基準の変数をOffとする)という意味
- input double LossCutRangePips = 10.0; // 損切り幅(Pips)
- //+------------------------------------------------------------------+
- //| Expert initialization function |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- //---
- //---
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| Expert deinitialization function |
- //+------------------------------------------------------------------+
- void OnDeinit(const int reason)
- {
- //---
- }
- //+------------------------------------------------------------------+
- //| Expert tick function |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- // 本足始値取得
- Now_Price = ((Ask+Bid)/2);//ポジの保有時
- if(TicketL==0)//ポジションLが0の場合
- {
- TicketL = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,0,0);//買いを成り行き注文
- Last_EntryL = Now_Price;
- }
- if(TicketS==0)//ポジションSが0の場合
- {
- TicketS = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,0,0);//売りを成り行き注文
- Last_EntryS = Now_Price;
- }
- //-------------------------------------------------------------------------------------------
- //Lのピラミッティング主要
- if(Now_Price - Last_EntryL >= Scale)// Scale値以上上昇している場合
- {
- TicketL = OrderSend(_Symbol,OP_BUY,Lots,Ask,Sleppage,0,0,NULL,0,0,clrRed);//Lをピラミ
- Last_EntryL = Now_Price;//前回のエントリー値を今のエントリー値に書き代える
- }
- //----------------------------------------------------------------------------------------------
- //Sのピラミッティング主要
- else if(Last_EntryS - Now_Price >= Scale)// Scale値以上下降している場合
- {
- TicketS = OrderSend(Symbol(), OP_SELL, Lots, Bid, Sleppage, 0, 0, NULL, 0, 0, clrBlue);// Sをピラミッティング
- Last_EntryS = Now_Price;//前回のエントリー値を今のエントリー値に書き代える
- }
- //-------------------------------------------------------------------------------------------------
- {
- //---
- // ----------------------------------------
- // LとSのポジション毎にポジションの平均レートを算出する
- // ----------------------------------------
- double buyRatesTotal = 0; // 買いポジションレートの合計(ロット数考慮)
- double sellRatesTotal = 0; // 売りポジションレートの合計(ロット数考慮)
- double buyPositionLots = 0; // 買いポジションの数
- double sellPositionLots = 0; // 売りポジションの数
- // ポジションの数と合計したレート合計を算出
- for(int i = OrdersTotal() -1; i >= 0; i--) {
- // オーダー選択失敗した場合は処理抜け
- if(OrderSelect(i, SELECT_BY_POS) == false || OrderSymbol() != Symbol()) {
- break;
- }
- // 買いポジションの場合
- if(OrderType() == OP_BUY) {
- buyRatesTotal += OrderOpenPrice() * OrderLots(); // 買いレートを足し算
- buyPositionLots += OrderLots(); // 買いポジションのロット数を加算
- }
- // 売りポジションの場合
- else if(OrderType() == OP_SELL) {
- sellRatesTotal += OrderOpenPrice() * OrderLots(); // 売りのレートを足し算
- sellPositionLots += OrderLots(); // 売りポジションのロット数を加算
- }
- else {
- // Do Nothig
- }
- }
- // レート合計 ÷ ポジションのロット数合計 = 平均レート
- // 現在レートを更新する
- RefreshRates();
- // ●●Pipsマイナスになったら損切る --------------------------------------------------
- // 現在のAskとBidを保持(レート)
- double ask = Ask;
- double bid = Bid;
- // 現在レートをAskとBidの平均とする
- double currentAverageRate = (ask + bid) / 2.0;
- // ロスカットのPipsからレートに変換
- double lossCutRangeRate = PipsToRate(LossCutRangePips);
- // -----
- // 買いの損切り
- if(buyPositionLots > 0) {
- double averageBuyRate = buyRatesTotal / buyPositionLots; // 買いポジション平均レート
- if(currentAverageRate < (averageBuyRate - lossCutRangeRate)) {
- CloseALLPosition(OP_BUY);
- }
- }
- // 売りの損切り
- else if(sellPositionLots > 0) {
- double averageSellRate = sellRatesTotal / sellPositionLots; // 売りポジション平均レート
- if(currentAverageRate > (averageSellRate + lossCutRangeRate)) {
- CloseALLPosition(OP_SELL);
- }
- }
- }
- }
- //+------------------------------------------------------------------+
- // 引数して指定した方向のポジションをすべて閉じる
- void CloseALLPosition(int orderType) {
- double price; // ポジションを閉じるときのレート
- if(orderType == OP_BUY) {
- price = Bid;
- }
- else if(orderType == OP_SELL) {
- price = Ask;
- }
- else {
- Print("{609F7007-6D2B-4AD4-ADAA-ABA829E1F958}");
- return;
- }
- for(int i = OrdersTotal() -1; i >= 0; i--) {
- // オーダーの選択が出来なかった場合は何らかの問題があるから処理抜け
- if(OrderSelect(i, SELECT_BY_POS) == false) {
- break;
- }
- // ポジションがクロースするポジションの方向と一致する場合
- if(OrderType() == orderType) {
- bool success = OrderClose(OrderTicket(), OrderLots(), price, Sleppage);
- // オーダークローズに失敗した場合はエラーメッセージだけ表示してなにも対応しない
- if(success == false) {
- Print(ErrorDescription(GetLastError())); // エラーメッセージの表示(英語)
- // TODO 本来はエラー処理を実行する
- }
- }
- // ポジションがクロースするポジションの方向と一致しない場合は次のチケットへ
- else {
- continue;
- }
- }
- // [TODO] 注文失敗したときのエラー処理未実装
- }
- double PipsToRate(double pips) {
- if(pips < 0) {
- // あまり好きではないが、マイナスの値で返す
- return -1;
- }
- switch(Digits) {
- case 2:
- case 3:
- return pips * 0.01;
- case 4:
- case 5:
- return pips * 0.0001;
- default:
- // あまり好きではないが、マイナスの値で返す
- return -1;
- }
- }
- //+------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement