MT4のプログラミングに関して質問があります。

double longer=112.2;
double longer2=112.5;
double longer3=200;

これは現在使用している自動売買プログラムのコードの一部です。1日に3回程度オーダー情報を基に112.2とか112.5などのように手作業で入力すれば後はその値を利用して自動売買できるようにコード打っております。ただ、「1日に3回程度オーダー情報を基に手作業で入力」という部分がどうしてもネックなので、そこも自動化したいと考えております。

現時点では、Trader’s web fxというサイトから必要なオーダー板をエクセルに自動的にコピーできるプログラムをvbaで作るところまでできていて、あとは例えばセルの1Hにある部分を上記の112.2や112.5などの部分に自動的に代入できれば完成という状態なのですが、エクセルのある1つのセルの値を112.2とか112.5のようなところに代入する方法がどうしても分からず、今回質問させ 討い燭世ことにしました。一度csvの形に保存してmt4から読み込む方法も考えたのですが、同時に複数のオーダー情報をしかるべき場所に代入できるかどうかが激しく疑問です。

double longer2=?の「?」の部分にはどういう関数入れたらよろしいでしょうか?ご教示くだされば大変幸いです。

回答1

エクセルの板情報(メガオーダー)をEAで読込む方法として、VBAから[添付画像]1.のようにCSVファイル出力したものをEAで読込むことが挙げられます。

([添付画像]1.の補足)
1列目:注文の種類 1:売り注文(オファー)、2:買い注文(ビッド)
2列目:価格

また、EAからのCSVファイル読込み方法は、下記[例]のようになります。なお、板情報(メガオーダー)に展開される価格の件数は動的に変化することが想定されるため、ご質問内容の変数「double longer2」などを動的配列に置き換えております。

[例]

#property strict

//| Constants
//—配列要素数バッファ
#define GINT_BUF_ARRAY_BOOKINFO 100 // 板情報

//| Definitions
//—[MQL4用]板情報における注文 の種類(MQL5では定義済み)
enum ENUM_BOOK_TYPE
{
BOOK_TYPE_SELL=1,// 売り注文(オファー)
BOOK_TYPE_BUY =2 // 買い注文(ビッド)
};

//| Variables
//—ファイルハンドル
int GintHandle_BookInfo_MegaOrder;// 板情報(メガオーダー)
//—板情報(メガオーダー)価格配列
double GlstdblBookInfo_MegaOrders_Sell[]; // 板情報:売り注文(オファー)
double GlstdblBookInfo_MegaOrders_Buy[];// 板情報:買い注文(ビッド)

//略:OnInit()関数

//| Expert tick function
void OnTick()
{

//略:板情報(メガオーダー)が不要な処理

// 通貨ペア別板情報(メガオーダー)ファイル名の設定
string PstrPath_BookInfo_MegaOrder="BookInfo_MegaOrder_";
StringAdd(PstrPath_BookInfo_MegaOrde r,Symbol());
StringAdd(PstrPath_BookInfo_MegaOrder,".csv");

// 通貨ペア別板情報(メガオーダー)ファイルの存在チェック
if(!FileIsExist(PstrPath_BookInfo_MegaOrder))
{
Print(PstrPath_BookInfo_MegaOrder,"が存在しません。 エラーコード:",GetLastError());
return;
}

// 通貨ペア別板情報(メガオーダー)ファイルを開く
GintHandle_BookInfo_MegaOrder=FileOpen(PstrPath_BookInfo_MegaOrder,FILE_CSV|FILE_SHARE_READ,’,’);

// 通貨ペア別板情報(メガオーダー)ファイル開けなかった場合の対処
if(GintHandle_BookInfo_MegaOrder==INVALID_HANDLE)
{
Print(PstrPath_BookInfo_MegaOrder,"が開けませんでした。 エラーコード:",GetLastError());
return;
}

//↓通貨ペア別板情報(メガオーダー)の読込み

// 使用する変数
ulong PlngReadLine=0;/ / CSVファイル行内の位置
string PstrBookType; // 注文の種類(ログ出力用)
ushort PshtBookType; // 注文の種類
double PdblPrice;// 価格
// 板情報(メガオーダー)価格配列を初期化
ArrayResize(GlstdblBookInfo_MegaOrders_Sell,0,GINT_BUF_ARRAY_BOOKINFO);
ArrayResize(GlstdblBookInfo_MegaOrders_Buy,0,GINT_BUF_ARRAY_BOOKINFO);

// CSVファイルの終端(EOF)まで読込みを繰り返す
while(!FileIsEnding(GintHandle_BookInfo_MegaOrder))
{
// CSVファイル内の行位置を記録
PlngReadLine++;
// CSVファイル内の現在行位置の列データを読込み
PstrBookType=FileReadString(GintHandle_BookInfo_MegaOrder); // 注文の種類(ログ出力用)
PdblPrice=FileReadNumber(GintHandle_BookInfo_MegaOrder);// 価格
// 注文の種類を設定
PshtBookType=(ushort)PstrBookType;

// 注文の種類が1:売り注文(オファー) の場合
if(PshtBookType==BOOK_TYPE_SELL)
{
ArrayAdd(GlstdblBookInfo_MegaOrders_Sell,PdblPrice);
}
// 注文の種類が2:買い注文(ビッド)の場合
else if(PshtBookType==BOOK_TYPE_BUY)
{
ArrayAdd(GlstdblBookInfo_MegaOrders_Buy,PdblPrice);
}
// 注文の種類が上記以外の場合
else
{
Print("板情報(メガオーダー)における注文の種類を判別できませんでした。",
" 行位置:",PlngReadLine,
" 判別できない値:",PstrBookType);
}

// CSVファイル内の次行位置まで読込みをスキップ
// (CSVファイル内の価格列から右側に当EAに対して無効な列が存在する場合の考慮)
while(!FileIsLineEnding(GintHandle_BookInfo_MegaOrder))
{
FileReadString(GintHandle_BookInfo_MegaOrder);
}
}

// 開いていた通貨ペア別板情報(メガオーダー)ファ ぅ襪鯤弔犬
FileClose(GintHandle_BookInfo_MegaOrder);
// 板情報(メガオーダー)価格の配列数を取得
uint PintSize_BookInfo_MegaOrders_Sell=ArraySize(GlstdblBookInfo_MegaOrders_Sell);
uint PintSize_BookInfo_MegaOrders_Buy=ArraySize(GlstdblBookInfo_MegaOrders_Buy);

// 板情報(メガオーダー)価格がない場合の対処
if(PintSize_BookInfo_MegaOrders_Sell==0 && PintSize_BookInfo_MegaOrders_Buy==0)
{
Print("板情報(メガオーダー)なし");
return;
}
//↑通貨ペア別板情報(メガオーダー)の読込み

//略:板情報(メガオーダー)が必要な処理
}

//| Functions
//—指定された値を配列の末端に追加
template<typename ARRAY,typename VALUE>
void ArrayAdd(ARRAY &MtypArray[],
const VALUE MTYP_VALUE)
{
uint PintNewLastIndex=Arr aySize(MtypArray);
ArrayResize(MtypArray,PintNewLastIndex+1,GINT_BUF_ARRAY_BOOKINFO);
MtypArray[PintNewLastIndex]=MTYP_VALUE;
}

//| Expert deinitialization function
void OnDeinit(const int reason)
{
FileClose(GintHandle_BookInfo_MegaOrder);
ArrayResize(GlstdblBookInfo_MegaOrders_Sell,0);
ArrayResize(GlstdblBookInfo_MegaOrders_Buy,0);
ArrayFree(GlstdblBookInfo_MegaOrders_Sell);
ArrayFree(GlstdblBookInfo_MegaOrders_Buy);
ZeroMemory(GlstdblBookInfo_MegaOrders_Sell);
ZeroMemory(GlstdblBookInfo_MegaOrders_Buy);
}

(備考)
1.MT4チャート画面で上記[例]のEAコードを使用する場合のCSVファイル配置場所
「(データフォルダ)\MQL4\Files」フォルダ配下

2.MT4ストラテジーテスター機能で上記[例]のEAコードを使用する場合のCSVファイル配置場所
「(デー 織侫ルダ)\tester\files」フォルダ配下

3.上記「データフォルダ」について
MT4画面のメニュー[ファイル]→[データフォルダを開く]選択で表示されるフォルダ

[添付画像]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA