inputdouble lot = 0.2;
inputdouble TakeProfitPips = 50;
inputdouble StopLossPips = 200;
int bar=0;
int shift=1;
int tiket;
int otkt;
double price;
int cnt;
double TPp,SLp;
int tkt;
int n;
int type;
int _OrdersTotal = 0;
// кол-во позиций, соответствующих критериям (текущий инструмент и заданный MagicNumber),// состоянием на текущий тикint now_OrdersTotal = 0;
// кол-во позиций, соответствующих критериям (текущий инструмент и заданный MagicNumber),// состоянием на предыдущий тикstaticint pre_OrdersTotal = 0;
// массив открытых позиций состоянием на текущий тикint now_OrdersArray[][2]; // [№ в списке][№ тикета, тип позиции]// текущий номер позиции в массиве now_OrdersArray (для перебора)int now_CurOrder = 0;
// текущий номер позиции в массиве pre_OrdersArray (для перебора)int pre_CurOrder = 0;
// массив для хранения количества закрытых позиций каждого типаint now_ClosedOrdersArray[6][3]; // [тип ордера][тип закрытия] // временные флагиbool OrderClosed = true, PendingOrderOpened = false;
// временные переменныеint pre_OrdersArray[][2]; // [количество позиций][№ тикета, тип позиции]//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
voidOnTick()
{
if(OrdersTotal()== 0 && iTime(Symbol(),PERIOD_M1,1)==D'14.01.16 16:30')
{
price=Open[shift];
tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot,price,3,price+StopLossPips*Point,price-TakeProfitPips*Point);
if(tiket<0)
{
Print("Ошибка OrderSend № - ",GetLastError());
}
}
if(OrdersTotal()!=0)
{
for(cnt=0; cnt<OrdersTotal(); cnt++)
OrderSelect(cnt,SELECT_BY_POS); // Если есть следующий
{ // Анализ ордеров:
price=OrderOpenPrice();
otkt = OrderTicket();
n=otkt;
//--------------------------------------------------------------if(OrderType()==OP_SELL && OrderMagicNumber()==0)
{
tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot*3,price+100*Point,1,price+StopLossPips*Point,price-TakeProfitPips*Point,"My order",n);
tiket=OrderSend(Symbol(),OP_SELLLIMIT,lot*9,price+200*Point,1,price+StopLossPips*Point,price-TakeProfitPips*Point,"My order",n);
}
}
}
_OrdersTotal = OrdersTotal(); // запоминаем общее количество позицийArrayResize( now_OrdersArray, _OrdersTotal ); // изменяем размер массива открытых позиций под текущее кол-воArrayInitialize( now_OrdersArray, 0.0 ); // обнуляем массив
now_OrdersTotal = 0; // обнуляем количество позиций, соответствующих критериямArrayInitialize( now_ClosedOrdersArray, 0.0 ); // обнуляем массивы закрытых позиций и сработавших ордеров//+------------------------------------------------------------------+//| Перебираем все позиции и записываем в массив //+------------------------------------------------------------------+for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
if ( OrderSelect( z, SELECT_BY_POS ) )
{
now_OrdersArray[now_OrdersTotal][0] = OrderTicket();
now_OrdersArray[now_OrdersTotal][1] = OrderType();
now_OrdersTotal ++;
}
}
ArrayResize( now_OrdersArray, now_OrdersTotal ); // изменяем размер массива открытых позиций под кол-во позиций, соответствующих критериям//+------------------------------------------------------------------+//| Перебираем список позиций предыдущего тика, и считаем сколько закрылось позиций и//| сработало отложенных ордеров//+------------------------------------------------------------------+for ( pre_CurOrder = 0; pre_CurOrder < pre_OrdersTotal; pre_CurOrder ++ )
{
tkt = pre_OrdersArray[pre_CurOrder][0]; // запоминаем тикет и тип ордера
type = pre_OrdersArray[pre_CurOrder][1];
OrderClosed = true; // предпологаем, что если это позиция, то она закрыласьfor ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ ) // перебираем все позиции из текущего списка открытых позиций
{
if ( tkt == now_OrdersArray[now_CurOrder][0] ) // если позиция с таким тикетом есть в списке,
{ OrderClosed = false; // значит позиция не была закрыта (ордер не был удалён)break;
}
}
if ( OrderClosed ) // если была закрыта позиция (удалён ордер),
{
if (OrderSelect( tkt, SELECT_BY_TICKET )) // выбиаем ее
n = tkt; // присваеваем n номер тикета
}
}
//+------------------------------------------------------------------+//| Удаляем ордер с магическим номером = тикету закрытой ранее позиции //+------------------------------------------------------------------+for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
if ( OrderSelect( z, SELECT_BY_POS ) )
otkt = OrderTicket();
if (n == OrderMagicNumber ())
{OrderDelete( otkt );}
}
return;
}
24時間働く複雑なロジックがあるが、ある時点でフリーズしてしまう。ソースコードが編集できないEX5では、このような現象が起こることがあります。インジケーターやExpert Advisorがハングアップしていることを外から判断することは可能ですか?特定の指標の計算部分について統計を取る?
インジケーターの場合、ハングアップした状態で、そのシンボルのチャートの更新を停止させることが可能なようです。Expert Advisorは、どのインジケータがホバーを引き起こしたかを特定しないものの、それを追跡することができます。
禁止事項の記録を更新中。禁止されている間、フォーラムに返信が来るが、読むことしかできない。そして、また解禁された後、続けるために誰がどこで答えたかを思い出すのはとても大変なことです。この問題を解決することは可能でしょうか(これ以上BANされないようにというアドバイスなしで)。また、一般的には、読んでもすぐに返事をする時間がない場合もあります。リマインダーフラグを「後で返信」に設定することは可能ですか?
まず考えて、それから実行すべきです。その逆はない。そうすれば、メモリに問題が生じることはありません。
金言!!!!
読んでもすぐに返信する時間がないこともあります。自分に対して「後で返信する」というリマインダーのようなフラグを立てることは可能でしょうか?
後で返信する」というリマインダーのフラグを自分に立てることは可能でしょうか?
MQL4のMathRound() で「指定した数値の最も近い整数に丸めた値を返す」ことについて質問です。
コード
結果
なぜそうなるのか、親切な皆さんは説明してくれますか?もし、このようにするのであれば、フルストップ以降の1桁目のみを考慮することをドキュメントに追加してください。
同僚、助けてください。自分の脳みそが足りないんだよ。
指値注文を出したロボットは、オープンポジションをクローズする際、残りの注文を削除する必要があります(ストップでもプロフィットでも構いません)。ただし、すべての注文ではなく、マジックナンバーがクローズポジションのチケットと等しいものを削除します。したがって、削除のトリガーはポジションクローズ・イベントでなければならない。私にとっては、この場合、このポジションがどのようにクローズしたかは重要ではありません(ただ、条件によって、SLでクローズした場合、制限がないことが判明し、それを取り除く必要があります)。でも、ディテールアップしてちゃんとやれば、トリガーはTPなんですよ。
そこで、ロボットは注文を削除するのですが、ポジションがクローズされた後ではなく、オープンされるとすぐに削除されます。そして、常に保留中の注文を 出したり消したりして、自分自身と戦うようになるのです。何が問題なのかをご覧ください。
ヘルプ、みんな、MacbookのMT4にロシア語を置くことができない、それは存在するようだが、それは象形文字で表示されていますが、メタエディタでは正常です。macのPlayで全て構築しました。
Wine 1.9.4はとてもありがたいです。