スポンサーリンク

ゼロから始めるMT4生活 9日目

MoneyTopics
【悲報】7G超過でリモート接続不可に!
CTN/XCB用取引所:PingExchange
DYM用取引所:MEXC BitGet

2号機置き場は元々楽天モバイルの無料接続を使っていましたが、1年更新する前に無料でバイバイしてWiMAX2+に変更したのですが・・・・ドコモHome5Gがもう少し早く出してくれていればdocomo一択だったのですが・・・。
なんと1月まだ半分も経過していないのに7G使い切ってしまったので速度制限でリモート接続出来なくなりました。
toncoinマイニング+CryptoTabBrowser+MT4はそんなにパケット消費するのか!?
ギガ放題にプラン変更しても来月まで適用されないので今月は速度制限で完全に死亡ですw
今までリモート接続して向こうのMT4のEAスクリプトを直接更新出来たのが、現場に行って直接更新しないと駄目になったのでテストが捗らない状態に・・・・。
メインPCは寝てる間は電源落としてるからデータとしてはどうなのかなぁ?
見てる感じ昨日115円割れ→今日113円までのランコルゲ(短期振れ幅大きい区間)があっても(そんな所ではエントリーせずに)無敗で売買出来ているからかなり期待しているのですが24時間動き続けている2号機側の結果を見てないから明日見に行こうかな?と・・。
今日も朝から動かしてるけど半日以上で5回しかエントリーせずにスキャット美香子利確子で狙い通りの瞬足トレードを決めているので良い感じです。
もちろん全無敗なんて無理なので極力負けないようにコツコツいって、何かの間違いで捕まって逆指値発動→大負けくらった時にコツコツがマイナスになるのか?が勝負になります。

そして浮動小数点演算ですが、ワイはpips以外で四則演算してなかったから応急処置で済ませましたが、唯一ランコルゲチェック(Ask-Bid)で現在のスワップ見て通常(楽天FXは0.005)で無ければエントリーしないというチェックを追加した部分でAsk-Bidという引算だけでも数値が狂っていたので完全に作り直す事にしました。

修正版ローソク足クラス

通貨クラス+通貨演算関数+日足クラスという形に変えています。
ワイは既存のプログラムがあるからintとdoubleの両方を使っていますが、今から新規で作る人は全部intで組んだ方がバグも生まなくて楽な気がします。

//+------------------------------------------------------------------+
//| 通貨クラス                                                          |
//+------------------------------------------------------------------+
class Currency
{
  private:
    int _ivalue;
    double _dvalue;
    //double to integer
    int _d2i(double value)
    {
      string tmp = DoubleToString(value, Digits);
      StringReplace(tmp, ".", "");
      return StringToInteger(tmp); 
    }
    //integer to double
    double _i2d(int value)
    {
      //ドル円仕様なので6桁ゼロ埋めで設定している
      string tmp = IntegerToString(value, 6, '0');
      int len = StringLen(tmp);
      string left = StringSubstr(tmp, 0, len - Digits);
      string right = StringSubstr(tmp, len - Digits, Digits);
      tmp = StringConcatenate(left, ".", right);
      return StringToDouble(tmp);
    }
  public:
    //コンストラクタ
    Currency()
    {
      _ivalue = 0;
      _dvalue = 0;
    }
    //コンストラクタ
    Currency(int value)
    {
      _ivalue = value;
      _dvalue = _i2d(value);
    }
    //コンストラクタ
    Currency(double value)
    {
      _dvalue = value;
      _ivalue = _d2i(_dvalue);
    }
    //コピーコンストラクタ
    Currency(const Currency &src)
    {
      _ivalue = src._ivalue;
      _dvalue = src._dvalue;
    }
    //int型取得
    int getInteger()
    {
      return _ivalue;
    }
    //double型取得
    double getDouble()
    {
      return _dvalue;
    }
    //pips加算
    void addPips(int pips)
    {
      _ivalue = _ivalue + pips;
      _dvalue = _i2d(_ivalue);
    }
};
//加算
Currency addCurrency(Currency &val1, Currency &val2)
{
  int new_int = val1.getInteger() + val2.getInteger();
  Currency new_currency(new_int);
  return new_currency;
}
//減算
Currency subCurrency(Currency &val1, Currency &val2)
{
  int new_int = val1.getInteger() - val2.getInteger();
  Currency new_currency(new_int);
  return new_currency;
}
//+------------------------------------------------------------------+
//| ローソク足クラス                                                       |
//+------------------------------------------------------------------+
class BarInfo
{
  private:
    int _shift;        //何本前のローソク足
    int _period;       //ローソク足(1分足など)指定
    Currency _open;    //始値
    Currency _close;   //終値
    Currency _high;    //最高値
    Currency _low;     //最安値
    int _entity_pips;  //実体pips
    int _upper_pips;   //上髭pips
    int _lower_pips;   //下髭pips
    int _barType;      //ローソク足種別

    //初期化処理
    void _init()
    {
      _open = Currency(iOpen(_Symbol, _period, _shift));
      _close = Currency(iClose(_Symbol, _period, _shift));
      _high = Currency(iHigh(_Symbol, _period, _shift));
      _low = Currency(iLow(_Symbol, _period, _shift));

      //陽線
      if (_open.getInteger() < _close.getInteger())
      {
        _entity_pips = _close.getInteger() - _open.getInteger();
        _upper_pips = _high.getInteger() - _close.getInteger();
        _lower_pips = _open.getInteger() - _low.getInteger();
        _barType = DA_BARTYPE_WHITE;
      }
      //陰線
      else if(_open.getInteger() > _close.getInteger())
      {
        _entity_pips = _open.getInteger() - _close.getInteger();
        _upper_pips = _high.getInteger() - _open.getInteger();
        _lower_pips = _close.getInteger() - _low.getInteger();
        _barType = DA_BARTYPE_BLACK;
      }
      //十字線(始値・終値が同じ)
      else
      {
        _entity_pips = 0;
        _upper_pips = _high.getInteger() - _close.getInteger();
        _lower_pips = _open.getInteger() - _low.getInteger();
        _barType = DA_BARTYPE_CROSS;
      }
    }

  public:
    //コンストラクタ(バー指定有り)
    BarInfo()
    {
      _shift = 0;
      _period = PERIOD_M1;
    }
    //コンストラクタ(バー指定有り)
    //@param shift  解析したいバーシフト、何本前
    //@param period 解析したいバーの1分足とか5分足とか
    BarInfo(int shift, int period)
    {
      _shift = shift;
      _period = period;
      _init();
    }
    //データリフレッシュ
    void refresh()
    {
      RefreshRates();
      this._init();
    }
    //陽線か?
    bool isWhite()
    {
      return (_barType == DA_BARTYPE_WHITE);
    }
    //陰線か?
    bool isBlack()
    {
      return (_barType == DA_BARTYPE_BLACK);
    }
    //始値取得
    Currency getOpen()
    {
      return _open;
    }
    //終値取得
    Currency getClose()
    {
      return _close;
    }
    //最高値取得
    Currency getHigh()
    {
      return _high;
    }
    //最安値取得
    Currency getLow()
    {
      return _low;
    }
    //実体取得
    int getEntityPips()
    {
      return _entity_pips;
    }
    //上髭取得
    int getUpperPips()
    {
      return _upper_pips;
    }
    //下髭取得
    int getLowerPips()
    {
      return _lower_pips;
    }
};

浮動小数点演算の確認サンプル

こういう感じにOnInitに書けば

int OnInit()
  {
    Print("ずれるの", Ask - Bid);
    Print("ずれないの", NormalizeDouble(Ask - Bid, Digits));
    Currency ask(Ask);
    Currency bid(Bid);
    Print("ずれないの", subCurrency(ask, bid).getDouble());
    return(INIT_SUCCEEDED);
  }

EAを最初に起動した時にターミナルのエキスパートタブに下記ログが出力されるので確認できます。

2022.01.14 21:50:59.289 damepo_ea01 USDJPY: ずれないの0.005
2022.01.14 21:50:59.289 damepo_ea01 USDJPY: ずれないの0.005
2022.01.14 21:50:59.289 damepo_ea01 USDJPY: ずれるの0.004999999999995453

NormalizeDoubleの中で演算すれば一応は大丈夫なのかな?
理論上そんなこたぁないと思うから丸めてるだけ?どっち??

コメント

タイトルとURLをコピーしました