double indikator[75][31];//Значения разных индикаторов
double fiks[3];//Фиксация приболи и убытка
//**************************************************************
void OnTick()
{
if(OrdersTotal()==0)
{
uo(indikator);//работает
st1(fl(),sw(),ST(),PT());
OrderModifi();
}
}
//*************************************************************
string sw()
{
string swop = "yes";
double p = MarketInfo(_Symbol,MODE_SWAPLONG);
double p1 = MarketInfo(_Symbol,MODE_SWAPSHORT);
if(p>0.0)
swop = "buy";
else
if(p1>0.0)
swop = "sell";
if(p<0.0 && p1<0.0)
swop = "bouth";
else
if(p>0.0 && p1>0.0)
swop = "test";
return(swop);
}
//+------------------------------------------------------------------+
double ST()
{
double Sl=0.0;
int Magic = 45789632;
switch(Stop)
{
case 0:
Sl=0.0;
break;
case 1:
for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
{
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
{
switch(OrderType())
{
case 0:
if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
Sl = NormalizeDouble(Bid-StopLoss*Point,Digits);
break;
case 1:
if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
Sl = NormalizeDouble(Ask+StopLoss*Point,Digits);
break;
}
};
}
break;
case 2:
for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
{
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
{
switch(OrderType())
{
case 0:
if(OrderStopLoss()==0.0)
Sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
break;
case 1:
if(OrderStopLoss()==0.0)
Sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);;
break;
}
};
}
break;
}
return(Sl);
}
//+------------------------------------------------------------------+
double PT()
{
double Pt=0.0;
int Magic = 45789632;
switch(Profit)
{
case 0:
Pt=0.0;
break;
case 1:
for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
{
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
{
switch(OrderType())
{
case 0:
if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
Pt = NormalizeDouble(Ask+TakeProfit*Point,Digits);
break;
case 1:
if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
Pt = NormalizeDouble(Bid-TakeProfit*Point,Digits);
break;
}
};
}
break;
case 2:
for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
{
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
{
switch(OrderType())
{
case 0:
if(OrderStopLoss()==0.0)
Pt = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
break;
case 1:
if(OrderStopLoss()==0.0)
Pt = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
break;
}
};
}
break;
}
return(Pt);
}
//+------------------------------------------------------------------+
void uy(double &gh2[3])
{
gh2[0]=ST();
gh2[1]=PT();
gh2[2]= N*Point;
}
//+------------------------------------------------------------------+
void OrderModifi()//+
{
for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
{
bool ticketss;
int Magic = 45789632;
uy(fiks);
double Sl= fiks[0];
double Pt= fiks[1];
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
{
switch(OrderType())
{
case 0:
if(OrderStopLoss()==0 && OrderTakeProfit()==0)
{
if((OrderOpenPrice()>Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()<Pt && OrderTakeProfit()!=Pt))
ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
break;
}
case 1:
if(OrderStopLoss()==0 && OrderTakeProfit()==0)
{
if((OrderOpenPrice()<Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()>Pt && OrderTakeProfit()!=Pt))
ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrWhite);
break;
}
}
}
}
}
//+------------------------------------------------------------------+
void st1(double Flot,string swop, double Sl, double Pt)
{
bool ticketss;
int Magic = 45789632;
switch(TORGISW)
{
case 0:
if(swop == "buy")
ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
break;
case 1:
if(swop == "sell")
ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
break;
case 2:
ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
break;
}
}
Я давно уже хочу сказать такое как тебе сказал ZenFX но не хочу никого обижать. А ведь это сказано не для того чтобы обидеть. Действительно у программиста мозг как-то по другому работает. Можно сказать как у идиота. М. Ботвинник сказал «Компьютер это идиот.» вот и попробуй поговорить с идиотом… Сам таким станешь.Я не обижаюсь. Для этого я сда и выкладываю чтобы подсказывали что и как делать. в последнем коде что то не учел. Сделки на продажу модернизируются, а на покупку нет. Подскажешь что не так сделал?
Код:double indikator[75][31];//Значения разных индикаторов double fiks[3];//Фиксация приболи и убытка //************************************************************** void OnTick() { if(OrdersTotal()==0) { uo(indikator);//работает st1(fl(),sw(),ST(),PT()); OrderModifi(); } } //*************************************************************
//**************************************************************
void OnTick()
{
if(OrdersTotal()==0)
{
uo(indikator);//работает
st1(fl(),sw(),ST(),PT());
OrderModifi();
}
}
//*************************************************************
И что вот интересно по одиночки открываю сделки на покупку или продажу (не вместе) оба ордера модернизируются. А если открыть одновременно то сделки на покупку не модифицируются.Я не обижаюсь. Для этого я сда и выкладываю чтобы подсказывали что и как делать. в последнем коде что то не учел. Сделки на продажу модернизируются, а на покупку нет. Подскажешь что не так сделал?
Код:double indikator[75][31];//Значения разных индикаторов double fiks[3];//Фиксация приболи и убытка //************************************************************** void OnTick() { if(OrdersTotal()==0) { uo(indikator);//работает st1(fl(),sw(),ST(),PT()); OrderModifi(); } } //************************************************************* string sw() { string swop = "yes"; double p = MarketInfo(_Symbol,MODE_SWAPLONG); double p1 = MarketInfo(_Symbol,MODE_SWAPSHORT); if(p>0.0) swop = "buy"; else if(p1>0.0) swop = "sell"; if(p<0.0 && p1<0.0) swop = "bouth"; else if(p>0.0 && p1>0.0) swop = "test"; return(swop); } //+------------------------------------------------------------------+ double ST() { double Sl=0.0; int Magic = 45789632; switch(Stop) { case 0: Sl=0.0; break; case 1: for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории { if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер { switch(OrderType()) { case 0: if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0) Sl = NormalizeDouble(Bid-StopLoss*Point,Digits); break; case 1: if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0) Sl = NormalizeDouble(Ask+StopLoss*Point,Digits); break; } }; } break; case 2: for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории { if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер { switch(OrderType()) { case 0: if(OrderStopLoss()==0.0) Sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits); break; case 1: if(OrderStopLoss()==0.0) Sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);; break; } }; } break; } return(Sl); } //+------------------------------------------------------------------+ double PT() { double Pt=0.0; int Magic = 45789632; switch(Profit) { case 0: Pt=0.0; break; case 1: for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории { if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер { switch(OrderType()) { case 0: if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0) Pt = NormalizeDouble(Ask+TakeProfit*Point,Digits); break; case 1: if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0) Pt = NormalizeDouble(Bid-TakeProfit*Point,Digits); break; } }; } break; case 2: for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории { if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер { switch(OrderType()) { case 0: if(OrderStopLoss()==0.0) Pt = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits); break; case 1: if(OrderStopLoss()==0.0) Pt = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits); break; } }; } break; } return(Pt); } //+------------------------------------------------------------------+ void uy(double &gh2[3]) { gh2[0]=ST(); gh2[1]=PT(); gh2[2]= N*Point; } //+------------------------------------------------------------------+ void OrderModifi()//+ { for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории { bool ticketss; int Magic = 45789632; uy(fiks); double Sl= fiks[0]; double Pt= fiks[1]; if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер { switch(OrderType()) { case 0: if(OrderStopLoss()==0 && OrderTakeProfit()==0) { if((OrderOpenPrice()>Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()<Pt && OrderTakeProfit()!=Pt)) ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow); break; } case 1: if(OrderStopLoss()==0 && OrderTakeProfit()==0) { if((OrderOpenPrice()<Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()>Pt && OrderTakeProfit()!=Pt)) ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrWhite); break; } } } } } //+------------------------------------------------------------------+ void st1(double Flot,string swop, double Sl, double Pt) { bool ticketss; int Magic = 45789632; switch(TORGISW) { case 0: if(swop == "buy") ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE); break; case 1: if(swop == "sell") ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE); break; case 2: ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE); ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE); break; } }
extern int Plot = 2;//Коэффициэнт увеличения лота
extern double Lot = 0.01;//Установка текущего лота
extern double Risk = 0.01;//Установка риска
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
extern int Slippage = 24;
extern int N = 45;
//**********************************************************************************
void OnTick()
{
//---
Comment(fiks[5]);
}
//+----
//**********************************************************************************
void uy(double &gh[5])
{
gh[0]=Lot;//лот для использования в дальнейших функциях
gh[1]=Risk;//риск для использования в дальнейших функциях
gh[2]=StopLoss;//убыток для использования в дальнейших функциях
gh[3]=TakeProfit;//профит фикс для использования в дальнейших функциях
gh[4]=N*Point;//трейлинг стопа для использования в дальнейших функциях
}
void st1(double Flot,string swop, double Sl, double Pt)
{
//bool ticketss; //НЕПРАВИЛЬНО!!! OrderSend возвращает № позиции, т.е. int
int ticketss;
int Magic = 45789632;
switch(TORGISW)
{
case 0:
if(swop == "buy")
//ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
//Не рекомендую ставить стопы и тейки при открытии позиции, лучше делать это сразу же ПОСЛЕ, тогда и отпадает нужда в куче лишних проверок
ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
// ........... получить значения Sl и Pt ...........................
if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))//если открытие прошло успешно, выбрать позицию
ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
//и все дела, повторить то же самое в других case'ах
break;
case 1:
if(swop == "sell")
ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
break;
case 2:
ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
break;
}
}
Да уж, дорогой Стар603, код, конечно, устрашающий (стиль программирования)... но это на вкус и цвет, понимаю.
Вопрос на засыпку: а отчего бы не модифицировать открытые позиции СРАЗУ после их открытия в st1, а не лепить для этого отдельную функцию OrderModifi(), тем более что между вызовами st1 и OrderModifi() никаких событий в OnTick не происходит? И отпадёт необходимость в куче лишних проверок и переборов. Например:
C-подобный:void st1(double Flot,string swop, double Sl, double Pt) { //bool ticketss; //НЕПРАВИЛЬНО!!! OrderSend возвращает № позиции, т.е. int int ticketss; int Magic = 45789632; switch(TORGISW) { case 0: if(swop == "buy") //ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE); //Не рекомендую ставить стопы и тейки при открытии позиции, лучше делать это сразу же ПОСЛЕ, тогда и отпадает нужда в куче лишних проверок ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE); // ........... получить значения Sl и Pt ........................... if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))//если открытие прошло успешно, выбрать позицию ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow); //и все дела, повторить то же самое в других case'ах break; case 1: if(swop == "sell") ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE); break; case 2: ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE); ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE); break; } }
if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))/
Вариантов много.Подскажите пожалуйста как сделать что бы индикатор .mq4 работал только на одной конкретно указанной валютной паре?На других парах ноль реакции.Спасибо!)
типа:
if(Symbol()!="EURUSD"){Alert("Неверная пара.. индикатор не работает");return(0);}
просто не встречала подобного живьём)))
extern string symbol = "GBPUSD";
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
{
string expire_symbol = (GBPUSD);
string e_s = expire_symbol;
if (symbol != e_s || symbol != Symbol())
{
Alert (Invalid currency pair. Contact the developer.);
return(0);
}
}
return(rates_total);
}
сенькию вери мач!)))Вариантов много.
Как пример:
Пример:extern string symbol = "GBPUSD"; int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { { string expire_symbol = (GBPUSD); string e_s = expire_symbol; if (symbol != e_s || symbol != Symbol()) { Alert (Invalid currency pair. Contact the developer.); return(0); } } return(rates_total); }
Come again!сенькию вери мач!)))
double fiks[10];//Дополнительные данные
extern double Lot = 0.01;//Установка текущего лота
extern double Risk = 0.01;//Установка риска
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
extern int Slippage = 24;
extern int N = 45;
//************************************************************
void uy(double &gh[10])
{
//для использования в дальнейших функциях
gh[0]=Lot;//лот
gh[1]=Risk;//риск
gh[2]= NormalizeDouble(StopLoss*Point,Digits);//убыток
gh[3]= NormalizeDouble(TakeProfit*Point,Digits);//профит
gh[4]= NormalizeDouble(N*Point,Digits);//трейлинг стопа
gh[5]= NormalizeDouble(MarketInfo(Symbol(),13)*Point,Digits);//спред
gh[6]= NormalizeDouble(MarketInfo(Symbol(),14)*Point,Digits);//минимальные пункты
gh[7]= NormalizeDouble(MarketInfo(Symbol(),18)*Point,Digits);//своп покупок
gh[8]= NormalizeDouble(MarketInfo(Symbol(),19)*Point,Digits);//своп продаж
gh[9]= NormalizeDouble(MarketInfo(Symbol(),33)*Point,Digits);//дист заморозки
}
Привет! У тебя правильно написана строка, если ее вставить в основную функцию индикатора, но тогда индикатор все равно будет инициализирован. Правильнее такую строку вставить в функцию инициализации и тогда индикатор не запустится вообще:Подскажите пожалуйста как сделать что бы индикатор .mq4 работал только на одной конкретно указанной валютной паре?На других парах ноль реакции.Спасибо!)
типа:
if(Symbol()!="EURUSD"){Alert("Неверная пара.. индикатор не работает");return(0);}
просто не встречала подобного живьём)))
int OnInit()
{
if(_Symbol!="EURUSD") {Alert("Неверная пара.. индикатор не работает"); return(INIT_FAILED);}
//--- indicator buffers mapping
extern string symbol = "EURUSD";
int OnInit()
{
if(_Symbol!=symbol) {Alert("Неверная пара.. индикатор не работает"); return(INIT_FAILED);}
//--- indicator buffers mapping
строиш свою трендовую на графике руками,
в скрипте\индюке\сове узнаеш нужные тебе параметры своей линии
спомощью
ObjectGet( string name, int prop_id)
name - имя твоего обекта
prop_id - Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.
Пример вызова:
PHP:double price1 = ObjectGet("hline12", OBJPROP_PRICE1);
в хелпе все достаточно понятно описано
Надо всего-то проверять стрелку на первом баре, а не нулевом…Всем привет! Кто подскажет чайнику как решить проблему.
Есть канальный ТМА индюк, что и где прописать что бы не дергалась стрелка, а намертво прикрепилась выдавая в буфер сигнал один раз в момент закрытии свечи на определенном ТФ за каналом. Для примера предоставляю скрин с индюком и алертом(стрелкой) в буфере. ТФ М15 (не имеет значения какой). Цена(свеча) зашла за уровень появляется долбаная стрелка и начинает мигать потому что, цена как угорелая бегает туди-сюди (я так полагаю, в таком случае И сигнал подается в буфер в таком же режиме как мигает стрелка). По этому, когда индюка ставишь в сову он выдает кучу ордеров, а ордер должен открыться только один в момент закрытия свечи на данном таймфрейме.
На скрине показано, что цена(свеча) зашла за канал, до закрытия свечи еще 9 минут 20 секунд а стрелка уже появилась. На самом деле стрелка должна появится только в момент закрытия свечи за каналом. Бывает такое что цена закрывается ниже канала, а бот уже выставит в лучшем случае несколько десятков ордеров (((.
Благодарю заранее за подсказку....
Посмотреть вложение 499871
блин наверное лоханулся, 0 бар это же текущая свечка которая двигается, нужно проверить, наверное забыл поставить 1 , нужно перепроверить...Надо всего-то проверять стрелку на первом баре, а не нулевом…
Привет, в мою команду нужен программист знающий язык mql. Хочешь войти в мою команду? Цель на 7 значную цифру в $Надо всего-то проверять стрелку на первом баре, а не нулевом…