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

star603

Новичок форума
Код:
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         if(OrderComment()="нет")//Все ошибки косаются этой строки. Это нужночтобы остановить лавину модификаций на новом баре.
           {
           }
        }
     }
  }

'OrderComment' - l-value required Umr3.mq4 516 13
'=' - l-value required Umr3.mq4 516 27
cannot implicitly convert type 'string' to 'bool' Umr3.mq4 516 27


Что это и как исправить?
 
Последнее редактирование:

Ugar

Гуру форума
Код:
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         if(OrderComment()="нет")//Все ошибки косаются этой строки. Это нужночтобы остановить лавину модификаций на новом баре.
           {
           }
        }
     }
  }

'OrderComment' - l-value required Umr3.mq4 516 13
'=' - l-value required Umr3.mq4 516 27
cannot implicitly convert type 'string' to 'bool' Umr3.mq4 516 27


Что это и как исправить?
if(OrderComment()=="нет")
 

Ugar

Гуру форума
Здравствуйте, я ищу человека, который бы смог мне помочь разрешить проблему с функцией ChartSetSymbolPeriod().
Использую ее при нажатии на кнопке. Переключение между инструментами происходит очень медленно.

Как добиться такого же быстродействия как в платформе , когда мышью перетаскиваешь ордер на график из списка ордеров и переключение происходит моментально.

Если у вас есть опыт в данном направлении , буду благодарен за помощью.
А по какому событию выполняется функция? Если она внутри OnTick, то она будет ждать тика.
 

intersheff

Прохожий
Всем здравствуйте никак не могу решить проблему , вопрос заключается вот в чем.
В autochartist есть вот такое диалоговое окно.
xxx.jpg

При клике на кнопке Вид происходит очень быстрый переход на другой инструмент в том же окне.
Если кто то знает как это реализовано на уровне кода подскажите пожалуйста , очень нужно.
Возможно ли как то ускорить функцию ChartSetSymbolPeriod (я использую ее при клике на кнопке в своей системе.Работает очень медленно) или может быть есть какие то другие решения без этой функции.
Буду рад и благодарен.
 
Последнее редактирование модератором:

intersheff

Прохожий
А по какому событию выполняется функция? Если она внутри OnTick, то она будет ждать тика.

функция используется внутри OnChartEvent при нажатии на кнопки
 

Ladzius

Элитный участник
Здрасте. Раскажите пожакуиста што не впоретке етом коде? Выбрасивают ошибку над "whichBar'
Спасибо



void manageAlerts()
{
if(!calculateValue && alertsOn)
{
if(alertsOnCurrent)
int whichBar = 0;

else
whichBar = 1;

whichBar = iBarShift(NULL,0,iTime(NULL,timeFrame,whichBar));
if(trend[whichBar] != trend[whichBar+1])
{
if(trend[whichBar+1] == 1 && trend[whichBar] != 1)
doAlert(whichBar,"sell");
if(trend[whichBar+1] == -1 && trend[whichBar] !=-1)
doAlert(whichBar,"buy");
}
}
}
 

Ugar

Гуру форума
Здрасте. Раскажите пожакуиста што не впоретке етом коде? Выбрасивают ошибку над "whichBar'
Спасибо



void manageAlerts()
{
if(!calculateValue && alertsOn)
{
if(alertsOnCurrent)
int whichBar = 0;

else
whichBar = 1;

whichBar = iBarShift(NULL,0,iTime(NULL,timeFrame,whichBar));
if(trend[whichBar] != trend[whichBar+1])
{
if(trend[whichBar+1] == 1 && trend[whichBar] != 1)
doAlert(whichBar,"sell");
if(trend[whichBar+1] == -1 && trend[whichBar] !=-1)
doAlert(whichBar,"buy");
}
}
}
if(alertsOnCurrent)
int whichBar = 0;
Получается что переменная объявлена по условию в if.
Если условие не соблюдается, то и переменной не существует.
Лучше сделать так
int whichBar = 0;
if(!alertsOnCurrent) whichBar = 1;
 

Ladzius

Элитный участник
if(alertsOnCurrent)
int whichBar = 0;
Получается что переменная объявлена по условию в if.
Если условие не соблюдается, то и переменной не существует.
Лучше сделать так
int whichBar = 0;
if(!alertsOnCurrent) whichBar = 1;
Типер ошибка пропала,но пропали и стрелки :(
 

star603

Новичок форума
Код:
double flot4()//Лот по заданнной геометрической прогрессии
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
                  Lot=0.02;
               break;
            case 1:
               if(MarketInfo(_Symbol,MODE_SWAPSHORT)>0)
                  Lot=0.02;
               break;
            default:
               Lot=Lot;
               break;
           }
        }
     }
   return(Lot);
  }

Почему то все ордера ставиться 0,02 хотя только на продажу так как у AUD/CAD положительный своп
 

Ugar

Гуру форума
Код:
double flot4()//Лот по заданнной геометрической прогрессии
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(MarketInfo(_Symbol,MODE_SWAPLONG)>0)
                  Lot=0.02;
               break;
            case 1:
               if(MarketInfo(_Symbol,MODE_SWAPSHORT)>0)
                  Lot=0.02;
               break;
            default:
               Lot=Lot;
               break;
           }
        }
     }
   return(Lot);
  }

Почему то все ордера ставиться 0,02 хотя только на продажу так как у AUD/CAD положительный своп
Бросается в глаза дурной тон все переменные делать глобальными. Из за этой привычки будет много косяков.
Допустим ордер Buy и MarketInfo(_Symbol,MODE_SWAPLONG) < 0, что должна возвращать функция и от куда это значение берётся?
Допустим Sell MarketInfo(_Symbol,MODE_SWAPSHORT) < 0, что должна возвращать функция и от куда это берётся?
А это ещё зачем Lot=Lot; ? Зачем переменной присваивать её же значение?
 

Kostya555

Интересующийся
А можно перевести эту формулу в Excel?

#property copyright "Copyright © 2009, Leif Karlsson"
#property link "mailto://[email protected]"
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 1
//+------------------------------------------------------------------+
extern int DEMAPeriod = 150;
extern int RSIPeriod = 150;
extern string AppliedPriceText1 = "Close: 0, Open: 1, High: 2, Low: 3";
extern string AppliedPriceText2 = "Median: 4, Typical: 5, Weighted: 6";
extern int AppliedPrice = 4;
extern int PriceShift = 0;
extern double UpLevel = 70;
extern double DownLevel = 30;
extern bool InvFish = false;
extern int MaxBars = 1000000;
//+------------------------------------------------------------------+
double UpBuffer[];
double DwBuffer[];
double EmaRsi1[];
double EmaRsi2[];
double Alpha = 0.0;
bool FirstRun = true;
//+------------------------------------------------------------------+
int init() {

IndicatorDigits(Digits+1);

IndicatorBuffers(4);

SetIndexStyle(0, DRAW_LINE);
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(0, UpBuffer);
SetIndexBuffer(1, DwBuffer);
SetIndexBuffer(2, EmaRsi1);
SetIndexBuffer(3, EmaRsi2);

SetLevelValue(0, UpLevel);
SetLevelValue(1, DownLevel);

IndicatorShortName("DEMA_RSI, DEMAPeriod: " + DEMAPeriod + ", RSIPeriod: " + RSIPeriod + " ");

Alpha = 2.0/(DEMAPeriod + 1.0);

return(0);
}
//+------------------------------------------------------------------+
int start() {
int i = IndicatorCounted();
if(i < 0) return(-1);
i = Bars - i;
if(i > MaxBars || FirstRun) {
FirstRun = false;
i = MaxBars;
ArrayInitialize(UpBuffer, EMPTY_VALUE);
ArrayInitialize(DwBuffer, EMPTY_VALUE);
ArrayInitialize(EmaRsi1, EMPTY_VALUE);
ArrayInitialize(EmaRsi2, EMPTY_VALUE);
}

while(i >= 0) {

double Rsi = iRSI(NULL, 0, RSIPeriod, AppliedPrice, PriceShift+i)-50.0;

if(EmaRsi1[i+1] != EMPTY_VALUE) EmaRsi1 = (1.0-Alpha)*EmaRsi1[i+1] + Alpha*Rsi;
else EmaRsi1 = Rsi;
if(EmaRsi2[i+1] != EMPTY_VALUE) EmaRsi2 = (1.0-Alpha)*EmaRsi2[i+1] + Alpha*EmaRsi1;
else EmaRsi2 = Rsi;

double DEmaRsi = 2.0*EmaRsi1 - EmaRsi2;
double OldDEmaRsi = 2.0*EmaRsi1[i+1] - EmaRsi2[i+1];
if(EmaRsi1[i+1] == EMPTY_VALUE || EmaRsi2[i+1] == EMPTY_VALUE) OldDEmaRsi = DEmaRsi;

if(InvFish) {
DEmaRsi = (1.0-MathExp(-0.2*DEmaRsi)) / (1.0+MathExp(-0.2*DEmaRsi));
OldDEmaRsi = (1.0-MathExp(-0.2*OldDEmaRsi)) / (1.0+MathExp(-0.2*OldDEmaRsi));
}
else {
DEmaRsi = DEmaRsi + 50.0;
OldDEmaRsi = OldDEmaRsi + 50.0;
}

if(DEmaRsi > OldDEmaRsi) {
UpBuffer = DEmaRsi;
DwBuffer = EMPTY_VALUE;
if(UpBuffer[i+1] == EMPTY_VALUE) UpBuffer[i+1] = OldDEmaRsi;
}
else {
DwBuffer = DEmaRsi;
UpBuffer = EMPTY_VALUE;
if(DwBuffer[i+1] == EMPTY_VALUE) DwBuffer[i+1] = OldDEmaRsi;
}
i--;
}

return(0);
}
 

griz

Активный участник
Здравствуйте. Может ли индикатор №1 вызвать пользовательскую функцию индикатора №2, если да, то как? И чтобы эта функция отработала на индикаторе №2.
 
Последнее редактирование:

vladradon

Программист
Здравствуйте. Может ли индикатор №1 вызвать пользовательскую функцию индикатора №2, если да, то как? И чтобы эта функция отработала на индикаторе №2.
Для этого в индикаторе №2 нужно во входных параметрах прописать какую-то переменную, которая при определенном значении в коде индикатора запустит функцию. А из индикатора №1 передавать это значение в нужный момент при обращении к индикатору №2 через iCustom.
 
  • Like
Реакции: griz

rus008

Почетный гражданин
Добрый день. Подскажите если данная идея готовая уже в открытом доступе?
Или если не сложно помогите реализовать ее.
Суть заключается в следующем:

Есть уровень(Не важно какой, от руки или от индикатора)
Цена если зашла за уровень в низ и прошла какое то определенное колличество пунктов,снова возвращется к нему,то выставлять отложку на продажу Sell Limit

Если цена прошла уровень в верх какое то определенное колличество пунктов, и при возвращении к нему, то выставить отложку на покупку Buy Limit

Важно чтоб цена именно ушла от уровня какое то определенное колличество пунктов.
Можно даже если цена ушла от уровня примерно 20 пунктов, то сразу выставлять отложку.
И очень важно чтоб ордера выставлялись 1 раз с одной стороны и 1 один раз с другой.
Если цена слишком далеко ушла,то по истечении к примеру 5 дней ордер удаляется.

Возможно ли такое сделать?
 

Вложения

  • Screenshot_32.png
    Screenshot_32.png
    129,2 КБ · Просмотры: 20

блондинка

Элитный участник
что то никак не соображу)))
как вытащить кастомный индикатор MT4 параболик,т.е. какая будет строчка кода?
там в нём два буфера,
а нужно вызвать по типу как стохастик;
double stoch = iStochastic(NULL, 0, 5, 3, 3,MODE_EMA,0,MODE_MAIN, i);
заранее спасибо!
всех с Наступающим НГ!!!!
 

vladradon

Программист
что то никак не соображу)))
как вытащить кастомный индикатор MT4 параболик,т.е. какая будет строчка кода?
там в нём два буфера,
а нужно вызвать по типу как стохастик;
double stoch = iStochastic(NULL, 0, 5, 3, 3,MODE_EMA,0,MODE_MAIN, i);
заранее спасибо!
всех с Наступающим НГ!!!!
Приветик! С наступающим! Там обращение начинается с iSAR(
дальше редактор все покажет.))
Только он не кастомный - наоборот терминальный.:)
 

блондинка

Элитный участник
Приветик! С наступающим! Там обращение начинается с iSAR(
дальше редактор все покажет.))
Только он не кастомный - наоборот терминальный.:)
понятно,большое спасибо)
я пыталась подсказку редактора получить,так кто ж знал что именно эти буквы надо писать!)))
не нашла их в интернете
ещё раз огромная благодарность!!!
 

Anton0708

Интересующийся
можно как то сделать так что бы MT4 не начал вести себя как бухой батя когда я скачал архив котировок и запихнул его туда?
пипец мешает🤦‍♂️
 

Ugar

Гуру форума
можно как то сделать так что бы MT4 не начал вести себя как бухой батя когда я скачал архив котировок и запихнул его туда?
пипец мешает🤦‍♂️
Отключить от сервера и использовать в офлайне. Можно в настройках задать использовать прокси.
 

star603

Новичок форума
с
Допустим ордер Buy и MarketInfo(_Symbol,MODE_SWAPLONG) < 0, что должна возвращать функция и от куда это значение берётся?
Допустим Sell MarketInfo(_Symbol,MODE_SWAPSHORT) < 0, что должна возвращать функция и от куда это берётся?
А это ещё зачем Lot=Lot; ? Зачем переменной присваивать её же значение?
Насчет этого:
Бросается в глаза дурной тон все переменные делать глобальными. Из за этой привычки будет много косяков.
Может и дурной тон я не знаю. Идея заключалась чтобы при запуске советника можно было бы задавать значения.
Допустим ордер Buy и MarketInfo(_Symbol,MODE_SWAPLONG) < 0, что должна возвращать функция и от куда это значение берётся?
Допустим Sell MarketInfo(_Symbol,MODE_SWAPSHORT) < 0, что должна возвращать функция и от куда это берётся?
Изначально задумано чтобы функция возвращала лот, который я пропишу в данном случае 0,02. А если эти условия не работают то возращается значение Lot который задается изначально
 
Верх