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

Код:
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


Что это и как исправить?
 
Последнее редактирование:
Код:
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()=="нет")
 
Здравствуйте, я ищу человека, который бы смог мне помочь разрешить проблему с функцией ChartSetSymbolPeriod().
Использую ее при нажатии на кнопке. Переключение между инструментами происходит очень медленно.

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

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

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

функция используется внутри OnChartEvent при нажатии на кнопки
 
Здрасте. Раскажите пожакуиста што не впоретке етом коде? Выбрасивают ошибку над "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");
}
}
}
 
Здрасте. Раскажите пожакуиста што не впоретке етом коде? Выбрасивают ошибку над "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;
 
if(alertsOnCurrent)
int whichBar = 0;
Получается что переменная объявлена по условию в if.
Если условие не соблюдается, то и переменной не существует.
Лучше сделать так
int whichBar = 0;
if(!alertsOnCurrent) whichBar = 1;
Типер ошибка пропала,но пропали и стрелки :(
 
Код:
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 положительный своп
 
Код:
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; ? Зачем переменной присваивать её же значение?
 
А можно перевести эту формулу в Excel?

#property copyright "Copyright © 2009, Leif Karlsson"
#property link "mailto://Leffemannen1973@telia.com"
//+------------------------------------------------------------------+
#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);
}
 
Здравствуйте. Может ли индикатор №1 вызвать пользовательскую функцию индикатора №2, если да, то как? И чтобы эта функция отработала на индикаторе №2.
 
Последнее редактирование:
Здравствуйте. Может ли индикатор №1 вызвать пользовательскую функцию индикатора №2, если да, то как? И чтобы эта функция отработала на индикаторе №2.
Для этого в индикаторе №2 нужно во входных параметрах прописать какую-то переменную, которая при определенном значении в коде индикатора запустит функцию. А из индикатора №1 передавать это значение в нужный момент при обращении к индикатору №2 через iCustom.
 
  • Like
Реакции: griz
Добрый день. Подскажите если данная идея готовая уже в открытом доступе?
Или если не сложно помогите реализовать ее.
Суть заключается в следующем:

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

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

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

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

Вложения

  • Screenshot_32.png
    Screenshot_32.png
    129,2 КБ · Просмотры: 21
что то никак не соображу)))
как вытащить кастомный индикатор MT4 параболик,т.е. какая будет строчка кода?
там в нём два буфера,
а нужно вызвать по типу как стохастик;
double stoch = iStochastic(NULL, 0, 5, 3, 3,MODE_EMA,0,MODE_MAIN, i);
заранее спасибо!
всех с Наступающим НГ!!!!
 
что то никак не соображу)))
как вытащить кастомный индикатор MT4 параболик,т.е. какая будет строчка кода?
там в нём два буфера,
а нужно вызвать по типу как стохастик;
double stoch = iStochastic(NULL, 0, 5, 3, 3,MODE_EMA,0,MODE_MAIN, i);
заранее спасибо!
всех с Наступающим НГ!!!!
Приветик! С наступающим! Там обращение начинается с iSAR(
дальше редактор все покажет.))
Только он не кастомный - наоборот терминальный.:)
 
Приветик! С наступающим! Там обращение начинается с iSAR(
дальше редактор все покажет.))
Только он не кастомный - наоборот терминальный.:)
понятно,большое спасибо)
я пыталась подсказку редактора получить,так кто ж знал что именно эти буквы надо писать!)))
не нашла их в интернете
ещё раз огромная благодарность!!!
 
можно как то сделать так что бы MT4 не начал вести себя как бухой батя когда я скачал архив котировок и запихнул его туда?
пипец мешает🤦‍♂️
 
можно как то сделать так что бы MT4 не начал вести себя как бухой батя когда я скачал архив котировок и запихнул его туда?
пипец мешает🤦‍♂️
Отключить от сервера и использовать в офлайне. Можно в настройках задать использовать прокси.
 
с
Допустим ордер 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 который задается изначально
 

Посмотрели (406) Посмотреть

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

Назад
Верх