CFD完全自動売買 (完結編)

ベースのMAサイン225は〜、4月上旬の成績が絶賛絶不調です。

しかーし、これをCFDで完全自動取引できるよう、整備しましたので完結編として今度こそ最終の締めくくりとします。

数ヶ月後に自分がみてもシステムが再構成できるように詳細に。。。

 

>>関連記事

 

:::システム概要図:::

CFD-SYSTEM

 

WindowsSever2012(VPS)で基本的にいろいろ処理します。基本的には、MAサイン225を除いて、外部ソフトや特別な設定が不要なように作り込んでいます。一部、どうしてもリモートデスクトップセッションの確立のみ、Linux(VPS)の力を借ります。

 

この概要図の処理が日々、完全自動で繰り返されます。

 

 

 

 

つづいて、関連システムソースコードです。

 

Windows PowerShell:::

Windows上で、MAサイン225とMT4の自動操作をするスクリプト集。

寄り引け版と、オーバーナイト版の両方に対応している。バグっている箇所が無ければ、1度起動すれば永遠に稼働し続ける。

cfd.ps1 : 全体のシステムの挙動を制御(このパワーシェルを起動する)

このスクリプトをWindowsServerで、パワーシェルコンソール上から最初の1回のみ手動起動する。起動後は完全放置で、日々自動売買が繰り返されます。

別スクリプトとして、寄り引け取り引きの”zaraba225.ps1”(8:02起動)と、オーバーナイト取り引きの”overnight225.ps1”(16:02起動)を呼び出します。土曜日と日曜日はトレード開始処理をスキップします。

echo '完全自動 CFD取引スクリプトを実行します。。。Good Luck!!'

do {
  $now = Get-Date -format HHmm 
  $now = $now -as [System.Int32]
  $dow = Get-Date -uformat %u
  $dow = $dow -as [System.Int32]

  if (($dow -eq 6) -or ($dow -eq 0)) {
    # 土曜日と日曜日はスクリプトを実行開始しない
  } else {
    if ($now -eq 802) {
        echo '寄り引けの自動売買実行プロセスを開始します、、、 '

        powershell.exe -File zaraba225.ps1

        echo '寄り引けトレード終了です'
        echo 'waiting,,, '
    } elseif ($now -eq 1602) {
        echo '夜間取引の自動売買実行プロセスを開始します、、、 '      

        powershell.exe -File overnight225.ps1

        echo '夜間取引終了です'
        echo 'waiting,,, '
    } 
  }

  Start-Sleep -s 60;

} while ($true)

更新履歴:

  • 2014/4/13 日曜日の値を7 -> 0へ変更しました(バグってました)
zaraba225.ps1 : 寄り引け取り引きの実行

cfd.ps1から、毎日(平日のみ)08:02に起動され、k-dbさんから日経225先物の前日夜間データを取得し、次にMAサイン225寄り引け版を起動し、サイン生成〜MT4による発注予約まで行う。最終的な稼働状況は、OneDriveに保存され、出先でも稼働結果の把握(MAサインの実行結果画面と、MT4起動状況)を可能とする。

このスクリプトは、15:21分〜15:25分の間に終了する。(ポジションの決済は、15:15にMT4のEAにより行われる)

制限事項として、8:00〜8:12分の間は、ローカル環境ならWindowsへのログイン状態、VPSならリモートデスクトップのセッションが有効状態であることを要する。この制限がクリアできていない場合の動作は保証されない。恐らく、サイン見送りで動くと想定。よって、注文は発注されない(と、思います)

$source = @"
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class MASign225Zara {

  private IntPtr hMASign225;

  public MASign225Zara() {
    hMASign225 = IntPtr.Zero;
  }

  [DllImport("user32.dll")]
  extern static uint SendInput(
    uint       nInputs,
    INPUT[]    pInputs,
    int        cbSize 
  );

  [StructLayout(LayoutKind.Sequential)]
  struct INPUT
  { 
    public int        type;
    public MOUSEINPUT mi;
  }

  [StructLayout(LayoutKind.Sequential)]
  struct MOUSEINPUT
      {
        public int    dx ;
        public int    dy ;
        public int    mouseData ;  // amount of wheel movement
        public int    dwFlags;
        public int    time;        // time stamp for the event
        public IntPtr dwExtraInfo;
    }

  const int MOUSEEVENTF_MOVED      = 0x0001 ;
  const int MOUSEEVENTF_LEFTDOWN   = 0x0002 ;  // 左ボタン Down
  const int MOUSEEVENTF_LEFTUP     = 0x0004 ;  // 左ボタン Up
  const int MOUSEEVENTF_ABSOLUTE   = 0x8000 ;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth,int nHeight, int bRepaint);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
     static extern bool SetForegroundWindow(IntPtr hWnd);

    public void startMASign225()  {

        System.Diagnostics.Process p = System.Diagnostics.Process.Start("C:\\Users\\UserAccount\\Documents\\MAサイン225 【2014版】\\MA2014      寄り引け.exe");
        p.WaitForInputIdle();

        hMASign225 = p.MainWindowHandle;
        MoveWindow(hMASign225, 0, 0, 800, 680, 1);

        if (hMASign225 != IntPtr.Zero) {
            SetForegroundWindow(hMASign225);
        }

    }

    public void clickMASign225(int px, int py, int width, int height) {
      if (hMASign225 != IntPtr.Zero) {
          SetForegroundWindow(hMASign225);
          INPUT[] input = new INPUT[3];

          input[0].mi.dx = px * (65535 / width);
          input[0].mi.dy = py * (65535 / height);
          input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
          input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
          input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
          SendInput(3, input, Marshal.SizeOf(input[0]));
      }
    }

    public void moveToForeground() {
      if (hMASign225 != IntPtr.Zero) {
          SetForegroundWindow(hMASign225);
      }
    }

    public void sendKeyMASign225(string key) {
      if (hMASign225 != IntPtr.Zero) {
        SendKeys.SendWait(key);
      }
    }
}
"@

################################################################################
# 実処理はここから開始
################################################################################    

# 既にMAサインの寄り引け版が起動済みなら、一度MAサインを終了する
Stop-Process -Name "MA2014      寄り引け" -errorAction silentlyContinue
Start-Sleep -s 10;

# 重複実行の防止機構
$da = Get-Date;
$todayStr = $da.ToString("yyyyMMdd");
$todayStr = $todayStr -as [System.String];
Write-Output $todayStr;

# クラウドに実行の痕跡を保存
$lockFile = "C:\Users\UserAccount\OneDrive\MASign225\" + $todayStr + "mo.lock";
if ( Test-Path $lockFile) {
  echo $lockFile;
  echo "file exists";
  return;
} else {
  New-Item $lockFile -itemType File;
}

$uri = New-Object System.Uri("http://k-db.com/futures/F101-0000?download=csv")
$file = Split-Path $uri.AbsolutePath -Leaf
$path = "C:\Users\UserAccount\OneDrive\MASign225"
$onedrivePath = "C:\Users\UserAccount\OneDrive\MASign225"
$workCSV = (Join-Path $path $file)

$wcli = New-Object System.Net.WebClient
$wcli.DownloadFile($uri, $workCSV)

(Get-Content -Path $workCSV)[1..3] | Out-File $workCSV
if ( Test-Path $workCSV) {
 # ok
} else {
 echo "skip zaraba process"
 return;    
}

Get-Content -Path $workCSV

$csv = Import-Csv $workCSV | Where-Object {$_.時刻 -eq "夜間"}
$openprice  = $csv.始値
$highprice  = $csv.高値
$lowprice   = $csv.安値
$closeprice = $csv.終値

# 画面サイズを取得する
[Void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")    
[System.Windows.Forms.Screen] $screen = [System.Windows.Forms.Screen]::PrimaryScreen;
[System.Drawing.Rectangle] $rect = $screen.Bounds;
$screenWidth  = $rect.Width;
$screenHeight = $rect.Height;

echo " "
echo "-- Screen Size --"
echo $rect.Width;
echo $rect.Height;
echo " "

# MASign225 のハンドラ
Add-Type -Language CSharp -TypeDefinition $source -ReferencedAssemblies System.Windows.Forms
$masign = New-Object -TypeName MASign225Zara;

# MAサイン225を起動する
$masign.startMASign225();
Start-Sleep -s 5;

# Click:日経平均株価取得
$masign.clickMASign225(80, 120, $screenWidth, $screenHeight);
Start-Sleep -s 30;

# 入力(前日夜間情報を自動入力)
$masign.sendKeyMASign225("{TAB}")
Start-Sleep -s 1;    
$masign.sendKeyMASign225("{TAB}")
Start-Sleep -s 1;        
$masign.sendKeyMASign225($openprice);
Start-Sleep -s 1;    
$masign.sendKeyMASign225("{TAB}")
Start-Sleep -s 1;        
$masign.sendKeyMASign225($highprice);
Start-Sleep -s 1;    
$masign.sendKeyMASign225("{TAB}")
Start-Sleep -s 1;        
$masign.sendKeyMASign225($lowprice);
Start-Sleep -s 1;
$masign.sendKeyMASign225("{TAB}")
Start-Sleep -s 1;    
$masign.sendKeyMASign225($closeprice);
Start-Sleep -s 2;

$masign.clickMASign225(560, 380, $screenWidth, $screenHeight)
Start-Sleep -s 5;

# サインを画面キャプチャする (ファイル定義)
$capFile = "C:\Users\UserAccount\Documents\zarabasign.bmp"

# 古いサインキャプチャファイルを削除する
Remove-Item $capFile  -errorAction silentlyContinue
Start-Sleep -s 3;    

$capWidth = 200 
$capHeight = 66
$capX = 470
$capY = 482 

# 準備:BitmapオブジェクトからGraphicsオブジェクトを作成    
$bmp = New-Object System.Drawing.Bitmap($capWidth, $capHeight);
$gfx = [System.Drawing.Graphics]::FromImage($bmp);

# スクリーンショットを取得 MASign225のサインのところ
$gfx.CopyFromScreen($capX, $capY, 0, 0, $bmp.Size);

# 画像ファイルを保存
$bmp.Save($capFile)

# MD5ハッシュ値を計算する
$md5Obj = [System.Security.Cryptography.MD5]::Create();

$stream = New-Object IO.StreamReader $capFile;
$hash = $md5Obj.ComputeHash($stream.BaseStream);

$md5sum = [System.BitConverter]::ToString($hash).ToLower().Replace("-","");
$stream.Close();

echo " "
echo "-- Sign MD5 --"
Write-Output $md5sum
echo " "

$signLong  = "fb20f7,,,,,,";
# linux fb20f7,,,,,,
# Mac 98b4b5,,,,,,

$signShort = "1f181,,,,,,";

$mt4p = -1;
switch ($md5sum) {

  $signLong {
    echo " "
    echo "--------------------"
    echo "   買いサインです!!";
    echo "--------------------"
    echo " "

    # 寄りで買い、日中引けで決済するEAが仕込まれたMT4を起動する
    $mt4p = (Start-Process -FilePath "C:\Program Files (x86)\XM MT4 225Zlong\terminal.exe" -PassThru).id
    Start-Sleep -s 60;
  }
  $signShort {
    echo " "
    echo "--------------------"
    echo "   売りサインです!!";
    echo "--------------------"
    echo " "

    # 寄りで売り、日中引けで決済するEAが仕込まれたMT4を起動する
    $mt4p = (Start-Process -FilePath "C:\Program Files (x86)\XM MT4 225Zshort\terminal.exe" -PassThru).id
    Start-Sleep -s 60;	
  }
  default {
    echo "!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "  トレードを見送ります..."
  }
}

# MAサイン225のシグナル判定が終わり、結果によってMT4が起動しているであろう状況をスクリーンキャプチャし、結果をクラウドへ保存する
$masign.moveToForeground();

# 全体をスクリーンキャプチャする
$bmp = New-Object System.Drawing.Bitmap($rect.Width, $rect.Height);
$gfx = [System.Drawing.Graphics]::FromImage($bmp);
$gfx.CopyFromScreen($rect.X, $rect.Y, 0, 0, $rect.Size, [System.Drawing.CopyPixelOperation]::SourceCopy);

# 画面全体キャプチャファイルを保存 (MAサイン225の実行結果とMT4起動状況が確認可能)
$resultSreenCaptureFilename = $todayStr + "mo_result.png"
$resultSreenCaptureFile = (Join-Path $onedrivePath $resultSreenCaptureFilename)
$bmp.Save($resultSreenCaptureFile, [System.Drawing.Imaging.ImageFormat]::Png)

# MAサイン225の終了ボタンをクリック
$masign.clickMASign225(640, 610, $screenWidth, $screenHeight)

# MT4終了予定時刻
$mt4terminateBegin = 1521;
$mt4terminateEnd   = 1525;

# このシェルから起動したMT4(terminal.exe)のみを終了する (手動起動した別のMT4を誤って終了させない)
if ($mt4p -ne -1) {
    do {
      $now = Get-Date -format HHmm 
      $now = $now -as [System.Int32]

      if (($now -ge $mt4terminateBegin) -and ($now -le $mt4terminateEnd)) {
          Stop-Process $mt4p;
          Start-Sleep -s 10;    
          break;
      } else {
          Start-Sleep -s 60;
      }
    } while ($true)
}
overnight225.ps1 : オーバーナイト取り引きの実行

cfd.ps1から、毎日(平日のみ)16:02に起動され、MAサイン225オーバーナイト版を起動し、サイン生成〜MT4による発注予約まで行う。最終的な稼働状況は、OneDriveに保存され、出先でも稼働結果の把握(MAサインの実行結果画面と、MT4起動状況)を可能とする。

このスクリプトは、4:00〜4:10の間に終了する。(ポジションの決済は、3:00にMT4のEAにより行われる)

制限事項として、16:00〜16:12分の間は、ローカル環境ならWindowsへのログイン状態、VPSならリモートデスクトップのセッションが有効状態であることを要する。この制限がクリアできていない場合の動作は保証されない。恐らく、サイン見送りで動くと想定。

$source = @"
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class MASign225 {

  private IntPtr hMASign225;

  public MASign225() {
    hMASign225 = IntPtr.Zero;
  }

  // マウス関連のWin32API
  [DllImport("user32.dll")]
  extern static uint SendInput(
    uint       nInputs,
    INPUT[]    pInputs,
    int        cbSize
  );

  [StructLayout(LayoutKind.Sequential)]
  struct INPUT
  { 
    public int        type;
    public MOUSEINPUT mi;
  }

  [StructLayout(LayoutKind.Sequential)]
  struct MOUSEINPUT
      {
        public int    dx ;
        public int    dy ;
        public int    mouseData ;  // amount of wheel movement
        public int    dwFlags;
        public int    time;        // time stamp for the event
        public IntPtr dwExtraInfo;
  }

  const int MOUSEEVENTF_MOVED      = 0x0001 ;
  const int MOUSEEVENTF_LEFTDOWN   = 0x0002 ;  // 左ボタン Down
  const int MOUSEEVENTF_LEFTUP     = 0x0004 ;  // 左ボタン Up
  const int MOUSEEVENTF_ABSOLUTE   = 0x8000 ;

  [System.Runtime.InteropServices.DllImport("user32.dll")]
  static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth,int nHeight, int bRepaint);

  [System.Runtime.InteropServices.DllImport("user32.dll")]
  static extern bool SetForegroundWindow(IntPtr hWnd);

    public void startMASign225()  {

        System.Diagnostics.Process p = System.Diagnostics.Process.Start("C:\\Users\\UserAccount\\Documents\\MAサイン225 【2014版】\\MA2014  オーバーナイト  .exe");
        p.WaitForInputIdle();

        hMASign225 = p.MainWindowHandle;
        MoveWindow(hMASign225, 0, 0, 780, 640, 1);

        if (hMASign225 != IntPtr.Zero) {
            SetForegroundWindow(hMASign225);
        }
    }

    public void clickMASign225(int px, int py, int width, int height) {
      if (hMASign225 != IntPtr.Zero) {
          SetForegroundWindow(hMASign225);
          INPUT[] input = new INPUT[3];

          input[0].mi.dx = px * (65535 / width);
          input[0].mi.dy = py * (65535 / height);
          input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
          input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
          input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
          SendInput(3, input, Marshal.SizeOf(input[0]));
      }
    }    

    public void moveToForeground() {
      if (hMASign225 != IntPtr.Zero) {
          SetForegroundWindow(hMASign225);
      }
    }    
}
"@

################################################################################
# 実処理はここから開始
################################################################################    

# 既にMAサインのオーバナイト版が起動済みなら、一度MAサインを終了する    
Stop-Process -Name "MA2014  オーバーナイト  " -errorAction silentlyContinue
Start-Sleep -s 10;

# 重複実行の防止機構
$da = Get-Date;
$todayStr = $da.ToString("yyyyMMdd");
$todayStr = $todayStr -as [System.String];
Write-Output $todayStr;

# クラウドに実行の痕跡を保存
$lockFile = "C:\Users\UserAccount\OneDrive\MASign225\" + $todayStr + "on.lock";
if ( Test-Path $lockFile) {
  echo $lockFile;
  echo "file exists";
  return;
} else {
  New-Item $lockFile -itemType File;
}

$onedrivePath = "C:\Users\UserAccount\OneDrive\MASign225"

# 画面サイズを取得する
[Void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")    
[System.Windows.Forms.Screen] $screen = [System.Windows.Forms.Screen]::PrimaryScreen;
[System.Drawing.Rectangle] $rect = $screen.Bounds;
$screenWidth  = $rect.Width;
$screenHeight = $rect.Height;

echo " "
echo "-- Screen Size --"
echo $rect.Width;
echo $rect.Height;
echo " "

# MASign225 のハンドラ
Add-Type -Language CSharp -TypeDefinition $source -ReferencedAssemblies System.Windows.Forms
$masign = New-Object -TypeName MASign225;

# MAサイン225を起動する
$masign.startMASign225();
Start-Sleep -s 10;

# Click:日経平均株価取得
$masign.clickMASign225(500, 150, $screenWidth, $screenHeight);
Start-Sleep -s 30;

# Click:サイン生成のボタンをクリック
$masign.clickMASign225(600, 250, $screenWidth, $screenHeight)

Start-Sleep -s 5;

# サインを画面キャプチャする
$capFile = "C:\Users\UserAccount\Documents\overnightsign.bmp"

# 古いファイルを削除する
Remove-Item $capFile  -errorAction silentlyContinue
Start-Sleep -s 3;    

$capWidth = 210 
$capHeight = 75
$capX = 500 
$capY = 375 

# 準備:BitmapオブジェクトからGraphicsオブジェクトを作成    
$bmp = New-Object System.Drawing.Bitmap($capWidth, $capHeight);
$gfx = [System.Drawing.Graphics]::FromImage($bmp);

# スクリーンショットを取得 MASign225のサインのところ
$gfx.CopyFromScreen($capX, $capY, 0, 0, $bmp.Size);

# 画像ファイルを保存
$bmp.Save($capFile);

# MD5ハッシュ値を計算する
$md5Obj = [System.Security.Cryptography.MD5]::Create();

$stream = New-Object IO.StreamReader $capFile;
$hash = $md5Obj.ComputeHash($stream.BaseStream);

$md5sum = [System.BitConverter]::ToString($hash).ToLower().Replace("-","");
$stream.Close();

echo " "
echo "-- Sign MD5 --"
Write-Output $md5sum
echo " "

$signLong  = "6d74b,,,,,,,";
#6d74b,,,,,,
#e7a8e,,,,,,
$signShort = "abc";

$mt4p = -1;

switch ($md5sum) {

  $signLong {
    echo " "
    echo "--------------------"
    echo "   買いサインです!!";
    echo "--------------------"
    echo " "

    # イブニングセッション開始で買い、夜間引けで決済するEAが仕込まれたMT4を起動する    
    $mt4p = (Start-Process -FilePath "C:\Program Files (x86)\XM MT4 225Olong\terminal.exe" -PassThru).id
    Start-Sleep -s 60;
  }
  $signShort {
    echo " "
    echo "--------------------"
    echo "   売りサインです!!";
    echo "--------------------"
    echo " "

    # イブニングセッション開始で売り、夜間引けで決済するEAが仕込まれたMT4を起動する    
    $mt4p = (Start-Process -FilePath "C:\Program Files (x86)\XM MT4 225Oshort\terminal.exe" -PassThru).id
    Start-Sleep -s 60;
  }
  default {
    echo "!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "  トレードを見送ります..."
  }
}

# MAサイン225のシグナル判定が終わり、結果によってMT4が起動しているであろう状況をスクリーンキャプチャし、結果をクラウドへ保存する
$masign.moveToForeground();

# 全体をスクリーンキャプチャする
$bmp = New-Object System.Drawing.Bitmap($rect.Width, $rect.Height);
$gfx = [System.Drawing.Graphics]::FromImage($bmp);
$gfx.CopyFromScreen($rect.X, $rect.Y, 0, 0, $rect.Size, [System.Drawing.CopyPixelOperation]::SourceCopy);

# 画面全体キャプチャファイルを保存 (MAサイン225の実行結果とMT4起動状況が確認可能)
$resultSreenCaptureFilename = $todayStr + "on_result.png"
$resultSreenCaptureFile = (Join-Path $onedrivePath $resultSreenCaptureFilename)
$bmp.Save($resultSreenCaptureFile, [System.Drawing.Imaging.ImageFormat]::Png)

# MAサイン225の終了ボタンをクリック
Start-Sleep -s 10;
$masign.clickMASign225(680, 580, $screenWidth, $screenHeight)

# MT4終了予定時刻
$mt4terminateBegin = 400;
$mt4terminateEnd   = 410;

# このシェルから起動したMT4(terminal.exe)のみを終了する (手動起動した別のMT4を誤って終了させない)
if ($mt4p -ne -1) {
  echo 'waiting for MT4 terminate time'
}

if ($mt4p -ne -1) {
    do {
      $now = Get-Date -format HHmm 
      $now = $now -as [System.Int32]

      if (($now -ge $mt4terminateBegin) -and ($now -le $mt4terminateEnd)) {
          Stop-Process $mt4p;
          Start-Sleep -s 10;    
          break;
      } else {
          Start-Sleep -s 60;
      }
    } while ($true)
}

 

MT4 EAのサンプル (タイマー発注):::

時間指定発注EAの簡単なサンプルです。CFD取り引きの自動発注は、今のところこいつをそのまま使用しています。

MorningLong.mq4 : CFD取り引きをタイマー発注するMT4のEAサンプル

通貨・マジックナンバー単位でポジションを1ポジションに制限する。

extern int OPEN_MMDD = 0300; の近辺で、サーバータイムに沿って、トレード時間を設定する。このEA、売買と時間の組み合わせで4つ用意し、寄り引けとオーバーナイトのトレードに対応する。(実際は取り引き通貨の判定はしていないので、どの通貨・銘柄でも稼働する)

 

//+------------------------------------------------------------------+
//|                                                  MorningLong.mq4 |
//|                                     Copyright 2014, Life with FX |
//|                                             http://lifewithfx.jp |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Life with FX"
#property link      "http://lifewithfx.jp"
#property version   "1.01"
#property strict

#include    

#define COMMENT "LFX225"

extern int MAGIC = 140331;
extern double lots = 0.05;
extern int OPEN_MMDD  =  0300;
extern int CLOSE_MMDD =  0915;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   // 1秒毎に稼働する
   EventSetTimer(1);

   Comment("LONG!!\n",
   "  OpenTime: ", OPEN_MMDD,"\n",
   "  CloseTime: ", CLOSE_MMDD,"\n",
   "  PosLots: ", lots);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  //  
  int serverHM = Hour() * 100 + Minute();

  if (OPEN_MMDD <= serverHM &&
      serverHM  < OPEN_MMDD + 5 &&
      isOpenNewPosition()) {
      OrderSend(Symbol(), OP_BUY, lots, Ask, 15, 0, 0, COMMENT, MAGIC, 0, Blue);
  }

  if (CLOSE_MMDD <= serverHM &&
      serverHM   < CLOSE_MMDD + 5) {
      myCloseOrder();
      // 決済後の自動EA削除ロジックを無効化。こうしておかないと、MT4起動でEA自動設定ができない為
      // PostMessageA( WindowHandle( Symbol(), Period()), WM_COMMAND, 33050, 0);
  }

  }
//+------------------------------------------------------------------+
bool isOpenNewPosition() {
   for (int i = 0; i < OrdersTotal(); i++) {
          if (OrderSelect(i, SELECT_BY_POS) == false) {
              return true;
          }

          if (OrderSymbol() == Symbol() &&
              OrderMagicNumber() == MAGIC) {
              return false;
          }
   }
   return true;
}

void myCloseOrder() {

   for (int i = 0; i < OrdersTotal(); i++) {
          if (OrderSelect(i, SELECT_BY_POS) == false) {
              break;
          }
          if (OrderSymbol() != Symbol() ||
              OrderMagicNumber() != MAGIC) {
              continue;
          }

          OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, White);
          break;
  }
}

 

Linuxの設定:::

MAサイン225の自動操縦時には、ローカル環境なら実ユーザのログイン、VPSならリモートデスクトップによるセッション確立が必要である為、Linuxの力を借りて、タイマー起動でリモートデスクトップセッションを確立し、制約を回避する。

Linux cronの設定 : 時間指定処理の設定

crontab -e でcron(時間指定処理の設定)を行う。ここでは、月曜日から金曜日の、8時と16時にリモートデスクトップセッションを日々確立するように指定する。

00 8 * * 1-5 DISPLAY=:0 /home/xxx/rdesk.sh
00 16 * * 1-5 DISPLAY=:0 /home/xxx/rdesk.sh
Linux リモートデスクトップの起動サンプル : rdesktopを使用する
#!/bin/sh 

# rdesktop 
/usr/bin/rdesktop -k ja "サーバのIPアドレスか接続子情報" -u "接続ユーザ" -p "接続ユーザのパスワード" -g 1600x900 & 

# wait 13分
sleep 780 

# rdesktopを終了する (プロセスID指定)
isAlive=`ps -ef | grep rdesktop |grep -v grep | wc -l` 
if [ $isAlive = 1 ]; then 
  pidRdesk=`ps -ef | grep rdesktop |grep -v grep | awk '{ print $2; }'` 
  kill $pidRdesk 
else 
  echo "Oh!" 
fi 

echo "Task completed..."

 

— MAサイン225の詳細は下記のリンクから確認頂けます —

 

コメントを残す