ほとんどのブローカーには、オープンできるロット数に制限があります。場合によっては、1つのトレードチケットに対するブローカーの最大ロット数を超えるロット数を実現するために、複数のトレードをオープンすることが望ましい場合があります。いくつか実験を行った結果、sqOpenOrderWithErrorHandling()関数を以下のように変更することで、これが可能になることがわかりました。開発者や他のユーザーによって望ましいと判断される場合、将来のバージョンに含める提案としてこれを提示します。試してみたい方は自由にお試しいただけますが、他の機能に影響を与えないことを確認するために、必ず十分にテストを行ってください。私自身の個人的なテストでは(今のところ)他の機能を壊さないことが判明しているため、これを問題なく使用しています。.
EA Wizardによってdoubleとして定義されているLotsDecimalsの代わりに、私は通常、int変数のdecimalsを使用していることに注意してください。これはグローバルなint変数であり、特定のブローカーがロットサイズに許可している小数点以下の桁数として定義されます。ほとんどの場合、マイクロロットを許可するブローカーの場合は2です。以下のカスタムコーディングでは、EA Wizardの標準であるためLotsDecimalsを使用していますが、実際の私自身のコーディングでは、代わりにint変数のdecimalsを使用しています。.
int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
int ticket, error;
// ***** 独自の追加コード
double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
double jlots = orderLots; ;
double ilots = 0.0; ;
while(jlots>0.0)
{
ilots=jlots ;
if(ilots>mmaxlots) ilots=mmaxlots ;
if(ilots<mminlots) ilots=mminlots ;
ilots=NormalizeDouble(ilots,LotsDecimals) ;
jlots=jlots-ilots ;
if(symbol == “NULL”) {
ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
} else {
ticket = OrderSend(symbol, orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
}
// **** このセクションのカスタム追加コードの終わり…関数の最後にある追加コードを参照してください。.
if(ticket < 0) {
注文が失敗しました。エラーをログに書き込んでください。
return(-1*GetLastError());
}
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
Log(“注文がオープンしました: “, OrderTicket(), ” 価格: ”, OrderOpenPrice());
損切りと利益確定を設定する
ECNブローカーをサポートするために別々に行う必要がある
if((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT)) {
if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
Log(“注文が変更されました。ストップロス:“, realSL,”, Profit 目標値:“, realPT);
} else {
error = GetLastError();
Log(“注文の変更エラー: “, error, ” : “, ErrorDescription(error));
RefreshRates();
if(orderType == OP_BUY) price = Ask;
if(orderType == OP_SELL) price = Bid;
if(OrderClose(ticket, orderLots, price, 6) != true) {
error = GetLastError();
Log(“CANNOT CLOSE ORDER: “, OrderTicket(), “, Error opening order : “, error, ” : “, ErrorDescription(error));
return(-1*error);
}
}
}
if(jlots>0.0) continue ;
}
// **** このセクションのためのカスタム追加コードの終わり
return(ticket);
}