Ваши вопросы по языку MQL4

Sobolh

Прохожий
Пробую так, но не получается ошибка - ( - constant expression required)

double A,B,C,D,E; // Глобальные переменные
//--------------------

double num_array[5]={A,B,C,D,E};
int maxValueIdx=ArrayMaximum(num_array,WHOLE_ARRAY,0);
Alert("Max value = ",num_array[maxValueIdx]," at index=",maxValueIdx);
 

svitanak

Почетный гражданин
здравствуйте уважаемые программисты. возможно ли написать "шаблон"- сову с не сложным алгоритмом, но чтобы она брала сигнал на открытие ордера с индикатора, брошенного на график. то есть чтобы не переписывать сову под каждый индикатор, а чтобы проверить его пригодность в сове простым "вешанием " на график. то есть появилась стрелка - открылся ордер, не важно какая и с какого индикатора.
пс. прошу прощения, может вопрос глупый, так как с программированием не очень знаком.
 

gince

Местный знаток
Помогите с индикатором. Пост #3707 на прошлой странице.
Прикладываю скрин.
Описание скрина.
1,1 - цена выше ББ и следующий бар медвежий
if(UpBB<High[i+1] && Open[i+1]<Close[i+1] && Open[i+0]>Close[i+0]){
UpIntBB=1; //запоминаем
DnIntBB=0;
}

1,2 - ждем пересечения с верху в низ НОЛЬ в подвальном индикаторе
if(UpIntBB==1 && ELR0<0 && ELR1>0){
UpArrowBB=High+v_shift0*Point;//рисуем стрелку
UpIntBB=0;

2,1 3,1 4,1 5,1 не имеют потверждающих сигналов в подвальном индикаторе

Дальше должно быть понятно.

Голубая стрелка по условию 1,1. Она в новом индикаторе не нужна. Фиолетовая стрелка - я ее хочу видеть в новом индикаторе.
 

Вложения

  • ind.PNG
    ind.PNG
    46,7 КБ · Просмотры: 55
Последнее редактирование:

gince

Местный знаток
В добавок два индикатора. Это с них двоих хочу сделать один.
Со второго индикатора только по одному меньшему ББ.
 

Вложения

  • gi_ELR_Color.mq4
    3,4 КБ · Просмотры: 28
  • gi_2BB Arows.mq4
    6,5 КБ · Просмотры: 33

matro3

Почетный гражданин
Пробую так, но не получается ошибка - ( - constant expression required)

double A,B,C,D,E; // Глобальные переменные
//--------------------

double num_array[5]={A,B,C,D,E};
int maxValueIdx=ArrayMaximum(num_array,WHOLE_ARRAY,0);
Alert("Max value = ",num_array[maxValueIdx]," at index=",maxValueIdx);

Размер массива 4, а не 5.
 

Алекс34

Почетный гражданин
HTML:
if (ExtMapBuffer1[shift]= Low[shift]-7*Point && ExtMapBuffer1[0] != 0 && SoundBuy)
         {
         SoundBuy = true;
            if (UseSound) PlaySound (SoundFile);
               Alert("Dserg(", Symbol(), ", ", Period(), ")  -  BUY!!!"); 
         } 
      if (!SoundBuy && (ExtMapBuffer1[shift]= Low[shift]-7*Point || ExtMapBuffer1[0] == 0)) SoundBuy = True;
      if (ExtMapBuffer2[shift] = High[shift]+7*Point && ExtMapBuffer2[0] != 0 && SoundSell)
         {
         SoundSell = true;
            if (UseSound) PlaySound (SoundFile);
             Alert("Dserg (", Symbol(), ", ", Period(), ")  -  SELL!!!"); 
         } 
      if (!SoundSell && (ExtMapBuffer2[0]= High[0]+7*Point || ExtMapBuffer2[0] == 0)) SoundSell = True;

В чем ошибка?
 

matro3

Почетный гражданин
HTML:
if (ExtMapBuffer1[shift]= Low[shift]-7*Point && ExtMapBuffer1[0] != 0 && SoundBuy)
         {
         SoundBuy = true;
            if (UseSound) PlaySound (SoundFile);
               Alert("Dserg(", Symbol(), ", ", Period(), ")  -  BUY!!!"); 
         } 
      if (!SoundBuy && (ExtMapBuffer1[shift]= Low[shift]-7*Point || ExtMapBuffer1[0] == 0)) SoundBuy = True;
      if (ExtMapBuffer2[shift] = High[shift]+7*Point && ExtMapBuffer2[0] != 0 && SoundSell)
         {
         SoundSell = true;
            if (UseSound) PlaySound (SoundFile);
             Alert("Dserg (", Symbol(), ", ", Period(), ")  -  SELL!!!"); 
         } 
      if (!SoundSell && (ExtMapBuffer2[0]= High[0]+7*Point || ExtMapBuffer2[0] == 0)) SoundSell = True;

В чем ошибка?

В первом условии SoundBuy и так true, если заходит в условие, зачем ему присваивать true?
Аналогично SoundSell.
Что именно не получается?
 

_SERG_

Активный участник
HTML:
if (ExtMapBuffer1[shift]= Low[shift]-7*Point && ExtMapBuffer1[0] != 0 && SoundBuy)
         {
         SoundBuy = true;
            if (UseSound) PlaySound (SoundFile);
               Alert("Dserg(", Symbol(), ", ", Period(), ")  -  BUY!!!"); 
         } 
      if (!SoundBuy && (ExtMapBuffer1[shift]= Low[shift]-7*Point || ExtMapBuffer1[0] == 0)) SoundBuy = True;
      if (ExtMapBuffer2[shift] = High[shift]+7*Point && ExtMapBuffer2[0] != 0 && SoundSell)
         {
         SoundSell = true;
            if (UseSound) PlaySound (SoundFile);
             Alert("Dserg (", Symbol(), ", ", Period(), ")  -  SELL!!!"); 
         } 
      if (!SoundSell && (ExtMapBuffer2[0]= High[0]+7*Point || ExtMapBuffer2[0] == 0)) SoundSell = True;
В чем ошибка?

Вместо "=" в условии используется "==".
if (ExtMapBuffer1[shift]== Low[shift]-7*Point && ExtMapBuffer1[0] != 0 && SoundBuy)
Дальше по аналогии.
 
Последнее редактирование:

vladradon

Программист
Возможно я не так выразился....
Мне нужно, что бы советник работал, после того как проверит, что MagicNumer во "входных параметрах" введен верно. А проверка происходит по типу:
if MagicNumber=AccountNumber*2-12345
Т.е. получается, что MagicNumber, будет для разных счетов, разный.
Если я правильно понял:
if (MagicNumber!=AccountNumber()*2-12345) return(0);
и эту строчку нужно поставить первой в функции int start() или, если void start() или void OnTick (), то
if (MagicNumber!=AccountNumber()*2-12345) return;
и если меджик не будет совпадать, то дальше сов работать не будет.
Или вообще выгрузить сова:
if (MagicNumber!=AccountNumber()*2-12345) ExpertRemove();
 
Последнее редактирование:

Алекс34

Почетный гражданин
Спасибо за помощь. Не получается алерт в индюк поставить. я не прогер, но хотел сам этот момент изучить. нефига не выходит.
вот код с уже моими дополнениями.весь код не получилось загрузить (большой). индюк в оригинале во вложении
HTML:
#property copyright "Nikelodeon"
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern bool       lines=true;
extern int       step=500;
extern bool       Dell=true;
extern int shift=1;      // На каком баре считать сигнал 0 - на текущем 1 - на закрытом
extern string SoundFile="Alert.wav";
extern bool UseSound=true;
bool SoundBuy  = False;
bool SoundSell = False;


//----buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,108);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexLabel(0,"BUY Signal");
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,108);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(1,"SELL Signal");
//----
	ObjectsDeleteAll(0,OBJ_TEXT);
	ObjectsDeleteAll(0,OBJ_ARROW);
	ObjectsDeleteAll(0,OBJ_TREND);
	//DelArrow(0,0);
	 
   return(0);

  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
 ObjectsDeleteAll(0,OBJ_TEXT);
ObjectsDeleteAll(0,OBJ_ARROW);  
ObjectsDeleteAll(0,OBJ_TREND);  
//----
   return(0);
  }

//+------------------------------------------------------------------+
//SetArrow(t[shift1],l[shift1]-15*Point,241,LIME);
void SetArrow(int sh, datetime tm, double pr, int cod,color clr)
{
	ObjectCreate("Arrow-"+sh,OBJ_ARROW,0,tm,pr);
	ObjectSet("Arrow-"+sh,OBJPROP_ARROWCODE,cod);
	ObjectSet("Arrow-"+sh,OBJPROP_COLOR,clr);
}
void SetArrow1(int sh, datetime tm, double pr, int cod,color clr)
{
	ObjectCreate("Arrow+"+sh,OBJ_ARROW,0,tm,pr);
	ObjectSet("Arrow+"+sh,OBJPROP_ARROWCODE,cod);
	ObjectSet("Arrow+"+sh,OBJPROP_COLOR,clr);
}

//SetText(t[shift1],l[shift1]-28*Point,"Engulfing",LIME);
void SetText(int sh,datetime tm,double pr,string text,color clr)
{
	ObjectCreate("x"+sh,OBJ_TEXT,0,tm,pr);
	ObjectSetText("x"+sh,text);
	ObjectSet("x"+sh,OBJPROP_COLOR,clr);
}
void SetText1(int sh,datetime tm,double pr,string text,color clr)
{
	ObjectCreate("y"+sh,OBJ_TEXT,0,tm,pr);
	ObjectSetText("y"+sh,text);
	ObjectSet("y"+sh,OBJPROP_COLOR,clr);
}

void Setline(int sh,datetime tm,double pr,datetime tm1,double pr1, color clr)
{
	ObjectCreate("-"+sh,OBJ_TREND,0,tm,pr,tm1,pr1,clr);
	ObjectSet("-"+sh,7,STYLE_SOLID);
	ObjectSet("-"+sh,10,false);
	ObjectSet("-"+sh,6,Yellow);
}
void Setline1(int sh,datetime tm,double pr,datetime tm1,double pr1, color clr)
{
	ObjectCreate("+"+sh,OBJ_TREND,0,tm,pr,tm1,pr1,clr);
	ObjectSet("+"+sh,7,STYLE_SOLID);
	ObjectSet("+"+sh,10,false);
	ObjectSet("+"+sh,6,LightBlue);
}                              
// Tampilkan disaat ada konfirmasi.
		
		StartBar-=1;
	}
	
//Comment(p3[1],p3[2],p3[3],p3[4],p3[5],p3[6],p3[7],)	;
//Comment(x1[1],x1[2],x1[3],x1[4],x1[5],x1[6],x1[7],)	;                       
//+------------------------------------------------------------------+ 
if (ExtMapBuffer1[0] = Low[shift]-7*Point && ExtMapBuffer1[0] != 0  && SoundBuy)
         {
         SoundBuy = false;
            if (UseSound) PlaySound (SoundFile);
               Alert("Dserg(", Symbol(), ", ", Period(), ")  -  BUY!!!"); 
         } 
      if (!SoundBuy && (ExtMapBuffer1[0]== Low[0]-7*Point || ExtMapBuffer1[0] == 0)) SoundBuy = True;
      if (ExtMapBuffer2[0] = High[0]+7*Point && ExtMapBuffer2[0] != 0 && SoundSell)
         {
         SoundSell = false;
            if (UseSound) PlaySound (SoundFile);
             Alert("Dserg (", Symbol(), ", ", Period(), ")  -  SELL!!!"); 
         } 
      if (!SoundSell && (ExtMapBuffer2[0]== High[0]+7*Point || ExtMapBuffer2[0] == 0)) SoundSell = True;
 //+------------------------------------------------------------------+      
   return(0);
}
 

Вложения

  • CANDLESTICK.mq4
    14,6 КБ · Просмотры: 29

Алекс34

Почетный гражданин
И вот момент в коде. может именно здесь для алерта функцию искать?
HTML:
//подтверждение		
			if( (BullEngulf || BullPierce || MorningStar || BullHarami || BullCross ) && 
				(Close[shift]>Close[shift1])&& Close[shift]>Open[shift1]){
//			ExtMapBuffer1[shift] = Low[shift]-7*Point;
			Name=true;
			Arrow=true;
			}
		else 
			{ExtMapBuffer1[shift] = 0.0; Name=false; Arrow=false; }

		if( (BearEngulf || DarkCloud || EveningStar || Shooter || BearHarami || BearCross) && 
				(Close[shift]<Close[shift1])&& Close[shift]<Open[shift1]){
//			ExtMapBuffer2[shift] = High[shift]+7*Point;
			Name1=true;
			Arrow1=true;
			}
		else 
			{ExtMapBuffer2[shift] = 0.0; Name1=false; Arrow1=false;}
			
      //Подтверждение молота отдельно
      
         if (Hammer){ 
            if ((down))  {Name=true;
                          Arrow=true;UseSound=true;}
  //                        ExtMapBuffer1[shift] = Low[shift]-7*Point;}
            else {Name=false; Arrow=false;}
            if ((up)) {Name1=true;
                       Arrow1=true;UseSound=true;}
                       
     //		           ExtMapBuffer2[shift] = High[shift]+7*Point;}
            else {Name1=false; Arrow1=false;}
         }
 

Алекс34

Почетный гражданин
Сделал такой вариант. ошибок нет как и алерта(((
 

Вложения

  • CANDLESTICK11.mq4
    17 КБ · Просмотры: 25

Expresso

Прохожий
Здроаствуйте господа програмисты! прошу помощи.! как сделать в сове стоплос, который выставляется на 30 пунктов ниже Low предыдущей свечи, так чтобы после этого трейлинг стоп работал! я как бы не програмист но потихоньку учусь сам. вот сделал сову по стратегии. но не совсем стоп выставляется правильно по тс. я сам делал что сто равен Low[1]-st но тогда не тралится позиция правильно, трал стоп в сторону убытка на 1000 пунктов переставляет и всё. а так без этого с обычным стопом трал работает. вот кстати стейт за последние пару месяцев с тестера. кто поможет поделюсь совом.
f88f2f07e6ed.gif
 

AlexeyVik

Программист mql4 mql5
Здроаствуйте господа програмисты! прошу помощи.! как сделать в сове стоплос, который выставляется на 30 пунктов ниже Low предыдущей свечи, так чтобы после этого трейлинг стоп работал! я как бы не програмист но потихоньку учусь сам. вот сделал сову по стратегии. но не совсем стоп выставляется правильно по тс. я сам делал что сто равен Low[1]-st но тогда не тралится позиция правильно, трал стоп в сторону убытка на 1000 пунктов переставляет и всё. а так без этого с обычным стопом трал работает. вот кстати стейт за последние пару месяцев с тестера. кто поможет поделюсь совом.
f88f2f07e6ed.gif
Выложи свой вариант трала и поможем тебе безвозмездно.
 

_Fatal_

Активный участник
привет пипл, скажите что не так в этом коде, не хочет динамический лот выставлять, пишет invalid lots amount for OrderSend function
OrderSend error 4051

//--------------------------------------------------------------------Определение величины лота
if(FixLot==true)
{
Lot=lotf;
}
if(FixLot==false)
{
Blc=AccountBalance();
MinLot = MarketInfo( Pair,MODE_MINLOT);
MaxLot = MarketInfo( Pair,MODE_MAXLOT);
if(MinLot==0.1)
{
MnLot2 = MnLot1/100;
}
if(MinLot==0.01)
{
MnLot2 = MnLot1/10;
}
MnLot1 = prc*Blc/100;
Lot=MnLot2*MinLot;
if(Lot>MaxLot)
{
Lot = MaxLot;
}
}
 

Ugar

Гуру форума
А сам то считал что получается? Или хотя бы принтовал значения переменных?
Не совсем ясно что за переменные. Если MnLot1 обычная локальная переменная.
То её значение =0 пока не назначено иное. Подставь значение в формулы.
MnLot2 = MnLot1/100; MnLot2 = 0/100=0;
MnLot2 = MnLot1/10; MnLot2 = 0/10=0;
Значит по любому MnLot2=0
Дальше считается лот Lot=MnLot2*MinLot; Lot=0*MinLot=0;
Итого результат плясок с бубном 0 лот.

Для начала надо формулу где считается значение MnLot1 = prc*Blc/100;поместить до строчки где это значение используется впервые. Кроме того желательно нормировать по человечьи.
Если попроще, как то так
min=MarketInfo(Symbol(),MODE_MINLOT);
max=MarketInfo(Symbol(),MODE_MAXLOT);
step=MarketInfo(Symbol(),MODE_LOTSTEP);
double lots=MathRound(lot/step)*step;
lots=MathMax(lots,min);
lots=MathMin(lots,max);
 
Последнее редактирование:

vladradon

Программист
привет пипл, скажите что не так в этом коде, не хочет динамический лот выставлять, пишет invalid lots amount for OrderSend function
OrderSend error 4051

//--------------------------------------------------------------------Определение величины лота
if(FixLot==true)
{
Lot=lotf;
}
if(FixLot==false)
{
Blc=AccountBalance();
MinLot = MarketInfo( Pair,MODE_MINLOT);
MaxLot = MarketInfo( Pair,MODE_MAXLOT);
if(MinLot==0.1)
{
MnLot2 = MnLot1/100;
}
if(MinLot==0.01)
{
MnLot2 = MnLot1/10;
}
MnLot1 = prc*Blc/100;
Lot=MnLot2*MinLot;
if(Lot>MaxLot)
{
Lot = MaxLot;
}
}
Нет нормализации лотов и расчет MnLot1 стоит после всех вычислений:
if(FixLot==false)
{
int Dig;
Blc=AccountBalance();
MnLot1 = prc*Blc/100;
MinLot = MarketInfo( Pair,MODE_MINLOT);
MaxLot = MarketInfo( Pair,MODE_MAXLOT);
if(MinLot==0.1)
{
MnLot2 = MnLot1/100;
Dig=1;
}
if(MinLot==0.01)
{
MnLot2 = MnLot1/10;
Dig=2;
}
Lot=NormalizeDouble(MnLot2*MinLot,Dig);
}
if(Lot>MaxLot)
{
Lot = MaxLot;
}
 
Последнее редактирование:

Yurkov

Почетный гражданин
Добрый вечер!
Подкиньте, пожалуйста, кусок кода, которым можно ограничить торговлю советника в определенный месяц.
 
Верх