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;
}
有一些复杂的逻辑可以工作二十四小时,但在某一点上它们会冻结。这种情况有时会发生在EX5中,它的源代码不能被编辑。是否有可能从外部确定一个指标或一个专家顾问挂起?收集特定指标的计算部分的统计数据?
对于指标,似乎是有可能的,因为它们处于挂起的状态,它们会杀死其符号上的图表的更新。专家顾问可以追踪它,尽管没有指定是哪个指标造成的悬停。
创下禁令的记录。在禁言期间,我在论坛上得到了回复,但我只能阅读它们。而在另一个禁令被解除后,很难记住谁和谁的回答,以便继续。有没有可能解决这个问题(没有建议不要再被禁止)?而在一般情况下,有时你读了,但没有时间立即回应。是否可以将提醒标志设置为 "稍后回复"?
你应该先思考,然后再做。而不是相反的方式。那么就不会有内存的问题了。
金句!!!"。
有时你读了它,却没有时间马上回复。有没有可能给自己设置某种提醒标志,让自己 "稍后回复"?
有没有可能给自己加一个 "稍后回复 "的提醒标志?
关于MQL4中MathRound() 的问题,它 "返回一个四舍五入到指定数值的最接近的整数的值"。
代码。
结果。
你们这些好心人能否解释一下为什么会出现这种情况?如果应该是这样,请在文件中加上只考虑句号后的第一个数字。
同事们,请帮忙。我自己的脑子不够用。
下了限价单的机器人,在关闭未平仓头寸(不管是止损还是盈利)时,需要删除剩余的订单,但不是每一个订单,而是魔法数字等于平仓票的那个订单。所以,删除的触发器必须是平仓事件。对我来说,在这种情况下,这个位置是如何关闭的并不重要(只是根据条件,如果通过SL关闭,那么就没有限制,必须删除)。但是,如果我们详细说明并做对了,触发器就是一个TP。
因此,机器人删除了订单,但不是在平仓后,而是在开仓后立即删除。而且它开始通过不断下达和删除待定订单 来与自己作斗争。请看看有什么问题。
帮助,伙计们,不能把俄语放在Macbook上的MT4上,它似乎是存在的,但它是以象形文字显示的,但在元编辑器中是好的。我都是通过Mac上的Play建立的。
如果能有Wine 1.9.4就更好了。