どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 451

 
//+------------------------------------------------------------------+
//| 注文の削除と決済、数量によるフィルタリング
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //削除/クローズされる最小のロット
extern double MaxLot = 0.1; //削除/バイパスされる最大ロット数
extern bool Buy = false; //買い注文の方向性を削除/閉じる
extern bool Sell = false; //売り注文の方向性を削除/閉じる
extern bool pending = true; //保留中の注文を削除する。
extern bool market = true; //マーケットポジションをクローズする。
extern int slippage = 2; //マーケットポジションのクローズ時の価格のスリッページ
//--------------------------------------------------------------------
int start()
{
ダブルSL,TP。
string txt=StringConcatenate("Script remove or close order, start ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS).TIME_SECONDS);
RefreshRates()。

bool error=true とする。
int Error,OT,Ticket,nn;
ダブルOOP,OL。
while(真)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice()。
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red)。
if (error) txt = StringConcatenate(txt,"\nClosed BUY Order",Ticket);
else txt = StringConcatenate(txt,"\nClosing error ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),スリッページ,Blue)。
if (error) txt = StringConcatenate(txt, "SELL order closed",Ticket;)
else txt = StringConcatenate(txt,"\nError ",GetLastError()," close ",Ticket).この場合、"GetLastError() "をクリックします。
}
if (OT>1)
{
error=OrderDelete(Ticket)です。
if (error) txt = StringConcatenate(txt,"\nOrderDeleted ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nError ",GetLastError()," removal ",StrOrdersType(OT)," ",Ticket).この場合、"Error "は "Error "となります。
}
if (!エラー)
{
Error = GetLastError()。
if (Error<2) continue;
if (Error==129)
{ Comment("価格が正しくありません",TimeToStr(TimeCurrent(),TIME_SECONDS));
スリープ(5000)。
RefreshRates()。
を続ける。
}
if (Error==146)
{
j++;
if (IsTradeContextBusy())スリープ(2000)。
を続ける。
}
Comment("エラー",Error," 注文を閉じる N ",OrderTicket(),
",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < オーダートータル(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++です。
if (nn>10) {Comment("全取引の決済に失敗しました、まだ",n)があります; break;}。
Sleep(1000)です。
RefreshRates()。
}
Comment(txt,"\nScript has finished its work ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0)です。
}
//--------------------------------------------------------------------
文字列 StrOrdersType(int t)
{
if (t==OP_BUY) return("買い");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit")。
if (t==OP_SELLLIMIT) return("SellLimit")。
if (t==OP_BUYSTOP) return("BuyStop")。
if (t==OP_SELLSTOP) return("SellStop")。
}

//--------------------------------------------------------------------

ロットサイズごとにすべてのペアの未決済注文を閉じるには、スクリプトに何を追加または変更すればよいですか。

 
Vitek、SRC ボタンでコード挿入!読めない落書きを掘り起こす必要があるのか!
 
pu6ka:
はい、Askの価格は表示されませんが、表示されます :)
ビジュアライザーでは、一時停止を押した後、チャートのプロパティで「アスクラインを表示」を選択し、テストを続けることができます。MT4の価格チャートは、通常Bidでプロットされます。

テストの質は何によって決まり、どうすれば最大限に高めることができるのか。
 
Zver4991:

そして、テストの質は何に依存し、どうすれば最大値に向かって向上させることができるのでしょうか。
正直なところ、よくわかりません。まだ必要ない、ホームページで調べよう
 

プロフェッショナルの皆様へ。
サイクルを使用せずに、保留中の注文の グリッドを開く方法を教えていただけませんか?
もし難しければ、少なくともそのようなコードの大まかな例を示してください。
グリッドの連続した順序ごとにステップとロットサイズを変更する可能性を持つ。

 
Forexman77:
行を入れました。

int Ticketの代わりに、エラーが出る。

'=' - 左角括弧、配列に期待される('=' - 左角括弧、配列に期待される)

'>' - 左角括弧は配列を表すものと思われます ('=' - 左角括弧は配列を表すものと思われます)

'>' - 予期しないトークン('>' - Unexpected token)

')'- 期待される課題('' - 期待される課題)

'continue' - 'break' または 'continue' は、いくつかのループ内でのみ使用されます )

などなど。


つまり、Ticketは旧バージョンのどこかでまだ使われているのです。コードをきれいにする必要がある...
 
1mql:

プロフェッショナルの皆様へ。
ループを使用せずに、保留中の注文のグリッドを開く方法を教えていただけませんか?
もし難しければ、少なくともそのようなコードの大まかな例を示してください。
グリッドで後続の注文のステップとロットサイズをそれぞれ変更できるようにした場合。

はい、実はループの中と同じなんです...。...ただし、ループはなし。ループで開く方法を示し、ループを使いたくない理由は、何を目指しているのかが不明 だからです。
 
borilunad:
Vitekさん、SRC ボタンでコードを貼り付けてくださいね。誰が読めない走り書きを掘り起こす必要があるのでしょうか!

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

すべてのペアの未決済注文をロットサイズごとに決済するためには、何を追加または変更すればよいですか。

 
Vitek2010:

すべてのペアの未決済注文をロットサイズごとに決済するためには、何を追加または変更すればよいですか。

最後のエクスターン以下。
extern int slippage = 2; // 成行決済時の価格スリッページ

をもう1つ入れる。
extern bool total_symb = true; //すべてのペアにおいて

と各ラインに表示されます。
if((OrderSymbol() ==Symbol()))
и
if(OrderSymbol() ==Symbol())

これに置き換えます。
if(OrderSymbol() ==Symbol() || total_symb)

理論的にはうまくいくはずなので、確認してみてください。

 
質問が発生した、エキスパートアドバイザーや スクリプトを記述することが 可能である、その日に例えば2%の損失を達成するために、すべてのトランザクションを閉じますか?