Алерт может быть и не программный, можно в терминале вручную его назначить на событие (окно терминала, вкладка Алерты). Но и не факт что это алерт. В терминале много поводов для звука. В настройках терминала, на вкладке события, назначаются звуки.Ребята всем привет, скажите пожалуйста что может быть с мт4, частенько вылетает звук алерта, а сигнала не от кокого индюка нет, убераю все индюки с графика все равно появляется звук, без окна алерта
Ребята всем привет, скажите пожалуйста что может быть с мт4, частенько вылетает звук алерта, а сигнала не от кокого индюка нет, убераю все индюки с графика все равно появляется звук, без окна алерта
Не подскажете, где можно посмотреть основные изменения в mql4 старого вида и нового? Пытаюсь что-то написать(простейшее, практически копию с учебника по мкл4), а выдает такие ошибки, как будто я на французском пишу, а не на мкл4.
А чем не нравится описание в документации?Не подскажете, где можно посмотреть основные изменения в mql4 старого вида и нового? Пытаюсь что-то написать(простейшее, практически копию с учебника по мкл4), а выдает такие ошибки, как будто я на французском пишу, а не на мкл4.
Кратко - в этом вложении. Полностью - на форуме MQL от начала создания 600+
А чем не нравится описание в документации?
наверно вы забываете обнулить STATUSУважаемые знатоки очень прошу разобраться с куском кода который прост как калашников но работает как ....
switch(STATUS)
{
case 0: // старт
if (CountBuy()==0 && CountSell()==0) STATUS=1;
break ;
case 1:
ticket=AntiRequoteOrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,comment,Magik,0,Red);
break ;
}
этот кусок почему то зацикливает и срабатывает в любом случае даже если счётчики ордеров милион.
На всякий случай выкладываю функции подсчёта ордеров, может ошибка кроется там, но я эти функции уже не год использую и раньше никогда проблем не возникало.
//---------------Начало Каунт бай-------------------------
int CountBuy()
{
int count=0;
for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(OrderType()==OP_BUY)
count++;
}
}
return(count);
}
//---------------Конец Каунт бай--------------------------
//------------------Начало коунт СЕЛЛ-----------------
int CountSell()
{
int count=0;
for(int trade=OrdersTotal()-1; trade>=0; trade --)
{
OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(OrderType()==OP_SELL)
count++;
}
}
return(count);
}
//------------------конец Коунт селл------------------
Заранее большущее спасибо за помощь. Аж стыдно просить вроде всё просто но ничего не работает.
По поводу "какие то ошибки", то есть какие то комментарии по этим ошибкам, пусть даже на английском.Не подскажете, где можно посмотреть основные изменения в mql4 старого вида и нового? Пытаюсь что-то написать(простейшее, практически копию с учебника по мкл4), а выдает такие ошибки, как будто я на французском пишу, а не на мкл4.
int start(){ oz_up=iCustom(Symbol(), 0, "OZ_M5", 3, 1); oz_dw=iCustom(Symbol(), 0, "OZ_M5", 2, 1); lag=iCustom(Symbol(), 0, "LAG_M5", 0, 1); if (Close[1]>oz_up && lag>0.5 && b==0) { b=2; s=0; if ( oz_up + MAX*Point >= Close[1]) { SendOrder(OP_BUY, Lot, "UP"); OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue); } else { OrderSend(Symbol(),OP_BUYLIMIT,Lot,NormalizeDouble(oz_up + OTS*Point ,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue); SendOrder(OP_BUY, Lot, "UP"); } } else { if (Close[1]<oz_dw && lag<0.5 && s==0) { s=2; b=0; if ( oz_dw - MAX*Point <= Close[1]) { SendOrder(OP_SELL, Lot, "DW"); OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Red); } else { OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(oz_dw - OTS*Point ,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Blue); SendOrder(OP_SELL, Lot, "DW"); } } } return(0);}//-------------------------------------------------------------------------bool SendOrder(int tip, double lot, string com){ for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if (OrderComment()==com) return(0); } } } int error,nn; while(true) { RefreshRates(); //------------------------------------------------------------------------- if (tip==OP_BUY) { for(int n=0;n<OrdersTotal();n++) { if (!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); n--; } if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); n--; } } error = 1; } //------------------------------------------------------------------------- if (tip==OP_SELL) { for(int p=0;p<OrdersTotal();p++) { if (!OrderSelect(p, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue; if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); p--; } if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); p--; } } error = 1; } //------------------------------------------------------------------------- if (error==-1) { Print("OrderSend Error ",GetLastError()," Lot ",lot); Sleep(1000); } else return(1); nn++; if (nn>10) return(0); } return(1);}//-------------------------------------------------------------------
static char Signal;Народ, кто знает, подскажите как в советнике на MQL 4 присвоить переменной значение при появлении стрелочки и не менять значение до появления следующей стрелочки? В промежутках между появлениями стрелки буфер = 0 для обоих, при появлении один буфер 0 другой больше нуля.
int start()
{
oz_up=iCustom(Symbol(), 0, "OZ_M5", 3, 1);
oz_dw=iCustom(Symbol(), 0, "OZ_M5", 2, 1);
lag=iCustom(Symbol(), 0, "LAG_M5", 0, 1);
if (Close[1]>oz_up && lag>0.5 && b==0)
{
b=2;
s=0;
if ( oz_up + MAX*Point >= Close[1])
{
SendOrder(OP_BUY, Lot, "UP");
OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue);
}
else
{
OrderSend(Symbol(),OP_BUYLIMIT,Lot,NormalizeDouble(oz_up + OTS*Point ,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue);
SendOrder(OP_BUY, Lot, "UP");
}
}
else
{
if (Close[1]<oz_dw && lag<0.5 && s==0)
{
s=2;
b=0;
if ( oz_dw - MAX*Point <= Close[1])
{
SendOrder(OP_SELL, Lot, "DW");
OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Red);
}
else
{
OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(oz_dw - OTS*Point ,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Blue);
SendOrder(OP_SELL, Lot, "DW");
}
}
}
return(0);
}
//-------------------------------------------------------------------------
bool SendOrder(int tip, double lot, string com)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderComment()==com) return(0);
}
}
}
int error,nn;
while(true)
{
RefreshRates();
//-------------------------------------------------------------------------
if (tip==OP_BUY)
{
for(int n=0;n<OrdersTotal();n++)
{
if (!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); n--; }
if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); n--; }
}
error = 1;
}
//-------------------------------------------------------------------------
if (tip==OP_SELL)
{
for(int p=0;p<OrdersTotal();p++)
{
if (!OrderSelect(p, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); p--; }
if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); p--; }
}
error = 1;
}
//-------------------------------------------------------------------------
if (error==-1)
{
Print("OrderSend Error ",GetLastError()," Lot ",lot);
Sleep(1000);
}
else return(1);
nn++;
if (nn>10) return(0);
}
return(1);
}
//-------------------------------------------------------------------
int start()
{
oz_up=iCustom(Symbol(), 0, "OZ_M5", 3, 1);
oz_dw=iCustom(Symbol(), 0, "OZ_M5", 2, 1);
lag=iCustom(Symbol(), 0, "LAG_M5", 0, 1);
if (Close[1]>oz_up && lag>0.5 && b==0)
{
b=2;
s=0;
if (oz_up + MAX*Point >= Close[1])
{
SendOrder(OP_BUY, Lot, "UP");
OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue);
}
else
{
OrderSend(Symbol(),OP_BUYLIMIT,Lot,NormalizeDouble(oz_up + OTS*Point ,Digits),slippage,0,Ask+Takeprofit*Point,0,Magic,0,Blue);
SendOrder(OP_BUY, Lot, "UP");
}
}
else
{
if (Close[1]<oz_dw && lag<0.5 && s==0)
{
s=2;
b=0;
if (oz_dw - MAX*Point <= Close[1])
{
SendOrder(OP_SELL, Lot, "DW");
OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Red);
}
else
{
OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(oz_dw - OTS*Point ,Digits),slippage,0,Bid-Takeprofit*Point,0,Magic,0,Blue);
SendOrder(OP_SELL, Lot, "DW");
}
}
}
return(0);
}
//-------------------------------------------------------------------------
bool SendOrder(int tip, double lot, string com)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
if (OrderComment()==com) return(0);
}
int error,nn;
while(true)
{
RefreshRates();
//-------------------------------------------------------------------------
if (tip==OP_BUY)
{
for(int n=0;n<OrdersTotal();n++)
{
if (!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); n--; }
if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); n--; }
}
error = 1;
}
//-------------------------------------------------------------------------
if (tip==OP_SELL)
{
for(int p=0;p<OrdersTotal();p++)
{
if (!OrderSelect(p, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow); p--; }
if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow); p--; }
}
error = 1;
}
//-------------------------------------------------------------------------
if (error==-1)
{
Print("OrderSend Error ",GetLastError()," Lot ",lot);
Sleep(1000);
}
else return(1);
nn++;
if (nn>10) return(0);
}
return(1);
}
//-------------------------------------------------------------------
//| Описание : Возвращает предыдущее значение. |
//+----------------------------------------------------------------------------+
//| Параметры: znachenie - подставляемое значение |
//+----------------------------------------------------------------------------+
double vernul=0; //|
//+----------------------------------------------------------------------------+
double STORY(double znachenie){
int count =0;
static double PROSHLOE = 0;
double NASTOIASHEE = znachenie;
if(NASTOIASHEE != PROSHLOE )count++;
if(count >0)vernul = PROSHLOE;
PROSHLOE = NASTOIASHEE;
return(vernul);
}
//+----------------------------------------------------------------------------+
// Сейчас так.
Comment("\n"
"настоящее значение ",(string)Buff_MA[1],"\n"
"прошлое значение ",(string)STORY(Buff_MA[1]),"\n"
"позапрошлое значение ",(string)STORY2(STORY(Buff_MA[1])) ,"\n"
"позапозапрошлое значение ",(string)STORY3(STORY2(STORY(Buff_MA[1]))) ,"\n"
);
//+---------------------------------------------------+//
// Хотелось бы, как то, так. (использовать одну функцию, а не несколько)
Comment("\n"
"настоящее значение ",(string)Buff_MA[1],"\n"
"прошлое значение ",(string)STORY(1,Buff_MA[1]),"\n"
"позапрошлое значение ",(string)STORY(2,Buff_MA[1]) ,"\n"
"позапозапрошлое значение ",(string)STORY(3,Buff_MA[1]) ,"\n"
);
//| Описание : Возвращает предыдущее значение. |
//+----------------------------------------------------------------------------+
//| Параметры: index - индекс значения |
//| znachenie - подставляемое значение |
//+----------------------------------------------------------------------------+
int kount =0;
double vernul=0; //|
//+----------------------------------------------------------------------------+
double STORY(int index ,double znachenie){
int counts =0;
static double PROSHLOE = 0;
double NASTOIASHEE = znachenie;
if(NASTOIASHEE != PROSHLOE )kount++;
if(kount-index != counts )counts = (kount-index);
if(counts >=0) vernul = counts;
// if(counts >=0) vernul = PROSHLOE;
PROSHLOE = NASTOIASHEE;
return(vernul);
}
//+----------------------------------------------------------------------------+
Можно в функцию передать заранее объявленный массив по ссылке и ничего не надо возвращать.Ещё вопрос. Я всё, о том же. Проконсультируйте пожалуйста.
Сделал счётчик, вывел его в ретурн, возвращает все предыдущие counts как надо.(счётчик предполагается как индекс).
Теперь можно ли как то так сделать, если так делается?
Сделать двумерный массив, в одной ячейке индекс, в другой значение. И вывести всё это в ретурн.
вернуть = Mass[index][znachenie];
в общем по индексу, возвращать предыдущее значение.(znachenie) если оно есть.
PHP://| Описание : Возвращает предыдущее значение. |//+----------------------------------------------------------------------------+//| Параметры: index - индекс значения |//| znachenie - подставляемое значение |//+----------------------------------------------------------------------------+int kount =0;double vernul=0; //|//+----------------------------------------------------------------------------+double STORY(int index ,double znachenie){ int counts =0; static double PROSHLOE = 0; double NASTOIASHEE = znachenie; if(NASTOIASHEE != PROSHLOE )kount++; if(kount-index != counts )counts = (kount-index); if(counts >=0) vernul = counts; // if(counts >=0) vernul = PROSHLOE; // PROSHLOE = NASTOIASHEE; return(vernul); }//+----------------------------------------------------------------------------+
А пример, будьте добры, если не затруднит.Можно в функцию передать заранее объявленный массив по ссылке и ничего не надо возвращать.
double STORY(double & Mass[])