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

Viktor73

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

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

блондинка

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

Вложения

  • ikokunomatome ahtf.mq4
    16,5 КБ · Просмотры: 23

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);
  }

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