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

Viktor73

Новичок форума
Товарищи . индикатор показывает уровни . все супер. но есть касяк. история переписывается. как сделать так чтобы индикатор писал данные раз в сутки в файл а потом их отрисовывал на графике.. пусть история начнетя сегодня. получится чем больше прописани история в файле тем точнее будет индикатоор.

нужна помощь в коде как писать данные в фай и их оттуда брать
 

блондинка

Элитный участник
Всем привет!Это японский индикатор,всё внутри вроде понятно кроме строчки 268 (это формула моментума?)
Нет ли тут ошибки?Строку не прикрепляю,сразу весь индикатор,может там и другие ошибки есть?Проверить бы!
Заранее спасибо)
 

Вложения

ZenFX

Почетный гражданин
Всем привет!Это японский индикатор,всё внутри вроде понятно кроме строчки 268 (это формула моментума?)
Нет ли тут ошибки?Строку не прикрепляю,сразу весь индикатор,может там и другие ошибки есть?Проверить бы!
Заранее спасибо)

Да это моментум ) простой, только через однопериодную МА ))) (которая как бы и есть цена). Цена Close на текущем отсчёте минус цена Close N периодов назад ). Ну типа изменение цены, за N периодов, больше или меньше цена стала ). Ну лучше разделить текущую цену, на цену N периодов назад и умножить на 100 это будет вот относительный моментум ) тип того ).
 
Последнее редактирование:

star603

Новичок форума
Код:
int sw()
  {
   switch(TORGISW)
     {
      case 0:
         if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
           P=0;
         break;
      case 1:
         if(MarketInfo(_Symbol,MODE_SWAPSHORT)>0)
            P=1;
         break;
      case 2:
            P=2;
         break;                
     }
   return(P);
  }

Почему?
possible loss of data due to type conversion Lavina.mq4 164 4 в 17 строке
 

Ugar

Гуру форума
Код:
int sw()
  {
   switch(TORGISW)
     {
      case 0:
         if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
           P=0;
         break;
      case 1:
         if(MarketInfo(_Symbol,MODE_SWAPSHORT)>0)
            P=1;
         break;
      case 2:
            P=2;
         break;               
     }
   return(P);
  }

Почему?
possible loss of data due to type conversion Lavina.mq4 164 4 в 17 строке
Где объявлена переменная Р? Опять на глобальном уровне. Зачем она там? А если нужна, зачем её возвращать? Какого она типа?
 

star603

Новичок форума
Где объявлена переменная Р? Опять на глобальном уровне. Зачем она там? А если нужна, зачем её возвращать? Какого она типа?
Я их там объявляю для того, чтобы в некоторых функциях можно было менять значение.
Код:
int P = 5;

написал над свич
 

star603

Новичок форума
Где объявлена переменная Р? Опять на глобальном уровне. Зачем она там? А если нужна, зачем её возвращать? Какого она типа?
Код:
double fl()//Функция по расчету лота
  {
   switch(LOT)
     {
      case 0://Фиксированный лот
         Flot=Lot;
         break;
      case 1://Лот по балансу
         Flot=NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
         break;
      case 2://Лот по эквити
         Flot=NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
         break;
      case 3://Лот по риску
         Flot=NormalizeDouble((AccountFreeMargin()*Risk)/1000,2);
         break;
      case 4://Лот по арифметической прогрессии
         for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               double Profit=OrderProfit()+OrderCommission()+OrderSwap();
               if(Profit>0.00001)
                  Flot = OrderLots()+0.01;
               else
                  if(Profit< -0.00001)
                     Flot = OrderLots()-0.01;
                  else
                     Flot = 0.01;
              }
           }
         break;
      case 5://Лот по геометрической прогрессии
         for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               double Profit=OrderProfit()+OrderCommission()+OrderSwap();
               if(Profit>0.00001)
                  Flot = OrderLots()*2;
               else
                  if(Profit< -0.00001)
                     Flot = OrderLots()-0.01;
                  else
                     Flot = 0.01;
              }
           }
         break;
      case 6://Лот по заданной арифметической прогрессии
         for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               double Profit=OrderProfit()+OrderCommission()+OrderSwap();
               if(Profit>0.00001)
                  Flot = OrderLots()+0.01*Plot;
               else
                  if(Profit< -0.00001)
                     Flot = OrderLots()-0.01*Plot;
                  else
                     Flot = 0.01;
              }
           }
         break;
      case 7://Лот по заданной геометрической прогрессии
         for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               double Profit=OrderProfit()+OrderCommission()+OrderSwap();
               if(Profit>0.00001)
                  Flot = OrderLots()*2*Plot;
               else
                  if(Profit< -0.00001)
                     Flot = OrderLots()-0.01*Plot;
                  else
                     Flot = 0.01;
              }
           }
         break;
      case 8:
         for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               if(OrderType()==OP_BUY)
                 {
                  if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
                     Flot=OrderLots()*2;
                  else
                     Flot=Lot;
                 }
               else
                  if(OrderType()==OP_SELL)
                    {
                     if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
                        Flot=OrderLots()*2;
                     else
                        Flot=Lot;
                    }
              }
           }
     }
   return(Flot);
  }

а тут замечательно и ошибок не выдает не смотря что Flot на глобальном уровне
 

Ugar

Гуру форума
Я их там объявляю для того, чтобы в некоторых функциях можно было менять значение.
Код:
int P = 5;
Вот. Только те переменные нужно объявлять на глобальном уровне, значение которых нужно менять в разных функциях. Например получил какое то значение при инициализации в OnInit, присвоил глобальной переменной, эта переменная и её значение доступно во всех функциях.
А если оно доступно во всех функциях, то не надо его возвращать, оно и без этого доступно. Так же не надо глобальную переменную использовать как аргумент функции.
 

star603

Новичок форума
Вот. Только те переменные нужно объявлять на глобальном уровне, значение которых нужно менять в разных функциях. Например получил какое то значение при инициализации в OnInit, присвоил глобальной переменной, эта переменная и её значение доступно во всех функциях.
А если оно доступно во всех функциях, то не надо его возвращать, оно и без этого доступно. Так же не надо глобальную переменную использовать как аргумент функции.

Код:
//Глобальное объявление
double Flot,P,P1;
//При инициализации то есть при запуске советника
int OnInit()
  {
//---
    P = MarketInfo(_Symbol,MODE_SWAPLONG);
    P1 = MarketInfo(_Symbol,MODE_SWAPLONG);
//---
   return(INIT_SUCCEEDED);
  }
  void OnTick()
  {
   uo(indikator);
   sw();
   Comment(P2);
  }
 //Пользовательская Функция
  void sw()
  {
   switch(TORGISW)
     {
      case 0//:+ покупок
         if(P>0)
            P2=0;
         break;
      case 1://:+ продаж
         if(P1>0)
            P2=1;
         break;
      case 2://без разницы
         if(P<0 && P1<0)
            P2=2;
         break;
     }
  }

Получилось как то так
 

fxbo

Активный участник
Всем привет, кто подскажет код для iCustom открытие ордера при каждом появлении сигнала в BAY или SELL, а также включение и выключение данного параметра в настройках.
 

Viktor73

Новичок форума
Всем привет, кто подскажет код для iCustom открытие ордера при каждом появлении сигнала в BAY или SELL, а также включение и выключение данного параметра в настройках.
Где нолики в iCustom там параметры индикатора.


if( что то ) // оно true или false
{

//верхняя линия
PriceHigh = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 1, 0);
//нижняя линия
PriceLow = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 2, 0);
//средняя линия(линия безубытка)
PriceMidl = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 0, 0);

//+------------------------------------------------------------------+

//Условия на продажу

if(Bid >= PriceHigh && CountSell() == 0 )
{
TP=NormalizeDouble(Bid - TakeProfit*Point, Digits); //Нормализуем тейкпрофит
SL=NormalizeDouble(Bid + StopLoss*Point, Digits); //Нормализуем стоплосс

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); //Открываем продажу
if ( ticket > 0) //если продажа открыта
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true)
res = OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 ); //при открытии продажи выставляем стопы
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss & Take Profit ордера успешно модифицирована.");
}
}

//+------------------------------------------------------------------+

//Условия на покупку

if( Ask <= PriceLow && CountBuy() == 0)
{
TP=NormalizeDouble(Ask + TakeProfit*Point, Digits); //Нормализуем тейкпрофит
SL=NormalizeDouble(Ask - StopLoss*Point, Digits); //Нормализуем стоплосс


ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); //открываем покупку
if ( ticket > 0)
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true) //если покупка открыта выставляем стопы
res=OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 );
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss & Take Profit ордера успешно модифицирована.");
}
}
}
 
  • Like
Реакции: fxbo

fxbo

Активный участник
Где нолики в iCustom там параметры индикатора.


if( что то ) // оно true или false
{

//верхняя линия
PriceHigh = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 1, 0);
//нижняя линия
PriceLow = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 2, 0);
//средняя линия(линия безубытка)
PriceMidl = iCustom(Symbol(), 0, IndicatorName, 0, 0, 0, 0, 0, 0, 0, 0);

//+------------------------------------------------------------------+

//Условия на продажу

if(Bid >= PriceHigh && CountSell() == 0 )
{
TP=NormalizeDouble(Bid - TakeProfit*Point, Digits); //Нормализуем тейкпрофит
SL=NormalizeDouble(Bid + StopLoss*Point, Digits); //Нормализуем стоплосс

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); //Открываем продажу
if ( ticket > 0) //если продажа открыта
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true)
res = OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 ); //при открытии продажи выставляем стопы
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss & Take Profit ордера успешно модифицирована.");
}
}

//+------------------------------------------------------------------+

//Условия на покупку

if( Ask <= PriceLow && CountBuy() == 0)
{
TP=NormalizeDouble(Ask + TakeProfit*Point, Digits); //Нормализуем тейкпрофит
SL=NormalizeDouble(Ask - StopLoss*Point, Digits); //Нормализуем стоплосс


ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); //открываем покупку
if ( ticket > 0)
{
if( OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES )==true) //если покупка открыта выставляем стопы
res=OrderModify( ticket, OrderOpenPrice(), SL, TP, 0 );
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss & Take Profit ордера успешно модифицирована.");
}
}
}

Благодарю, попробуем...
 

star603

Новичок форума
Код:
string swop;
//**********************************************************************************
int OnInit()
  {
//---
   P = MarketInfo(_Symbol,MODE_SWAPLONG);//Своп покупки
   P1 = MarketInfo(_Symbol,MODE_SWAPLONG);//Своп продажи
   if(P>0)
      swop = "Покупки";
   if(P1<0)
      swop = "Продажи";
   if(P>0 && P1)
      swop = "Оба";
//---
   return(INIT_SUCCEEDED);
  }
  //************************************************************************************
  void OnTick()
  {
   uo(indikator);//работает
   st1();//не работает
  }
    //**********************************************************************************
  void st1()
  {
   switch(TORGISW)
     {
      case 0:
         if(swop == "Покупки")
           {
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
      case 1:
         if(swop == "Продажи")
           {
            if(indikator[55][3]>0 && indikator[55][2]>0 && indikator[55][1]>0)
               ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
      case 2:
         if(swop == "Оба")
           {
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,0,0,"S1",Magic,clrNONE);
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
     }
  }
 
  почему не работает? вроде в инициализации определил, на глобальном инициализировал в пользовательской функцию вставил. Что сейчас не учел?
 

Ugar

Гуру форума
Код:
string swop;
//**********************************************************************************
int OnInit()
  {
//---
   P = MarketInfo(_Symbol,MODE_SWAPLONG);//Своп покупки
   P1 = MarketInfo(_Symbol,MODE_SWAPLONG);//Своп продажи
   if(P>0)
      swop = "Покупки";
   if(P1<0)
      swop = "Продажи";
   if(P>0 && P1)
      swop = "Оба";
//---
   return(INIT_SUCCEEDED);
  }
  //************************************************************************************
  void OnTick()
  {
   uo(indikator);//работает
   st1();//не работает
  }
    //**********************************************************************************
  void st1()
  {
   switch(TORGISW)
     {
      case 0:
         if(swop == "Покупки")
           {
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
      case 1:
         if(swop == "Продажи")
           {
            if(indikator[55][3]>0 && indikator[55][2]>0 && indikator[55][1]>0)
               ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
      case 2:
         if(swop == "Оба")
           {
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,0,0,"S1",Magic,clrNONE);
            if(indikator[55][3]<0 && indikator[55][2]<0 && indikator[55][1]<0)
               ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
           }
         break;
     }
  }
 
  почему не работает? вроде в инициализации определил, на глобальном инициализировал в пользовательской функцию вставил. Что сейчас не учел?
Сильно не вникал, но сразу бросается в глаза что для P и для P1 вызывается одна и та же функция, с одинаковыми аргументами.
Ну и конечно же, как и всегда, все переменные на глобальном уровне. Потенциально, это неисчерпаемый источник косяков.
Внутри пользовательской функции не объявлено ни одной переменной. Ну да, незачем пользоваться локальными переменными когда можно все сделать глобальными и долго развлекаться отлавливая глюки.
 

star603

Новичок форума
Сильно не вникал, но сразу бросается в глаза что для P и для P1 вызывается одна и та же функция, с одинаковыми аргументами.
Ну и конечно же, как и всегда, все переменные на глобальном уровне. Потенциально, это неисчерпаемый источник косяков.
Внутри пользовательской функции не объявлено ни одной переменной. Ну да, незачем пользоваться локальными переменными когда можно все сделать глобальными и долго развлекаться отлавливая глюки.
Код:
int OnInit()
  {
//---
   double p = MarketInfo(_Symbol,MODE_SWAPLONG);
   double p1 = MarketInfo(_Symbol,MODE_SWAPSHORT);
   string swop = "test";
   if(p>0.0)
      swop = "buy";
   if(p1>0.0)
      swop = "sell";
   if(p<0.0 && p1<0.0)
      swop = "buy";
   else
      swop = "test";
//---
   return(INIT_SUCCEEDED);
  }
  //**********************************************************
  void OnTick()
  {
   uo(indikator);//работает
   Comment(swop);
  }

пишет переменная не определена. Как быть?
 

Отслеживают (500) Посмотреть

Верх