Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как я могу закодировать это?
Если рынок коснется (X.XX50 или X.XX00)
то покупайте. Как определить последние два числа?
спасибо.Это должно сработать:
if ( Point == 0.01 ) {xPrice = Close - MathMod(Close,0.50) ; }
else { xPrice = Close - ( MathMod(100*Close,0.50)*0.01 ) ; }
P1Buffer = xPrice + Point*50;
P2Buffer = xPrice ;
P3Buffer = xPrice - Point*50;
[/CODE]
When MathMod(Close,0.50) = 0 then the price ends in 00 or 50.
Here's my indicator to identify 00 lines:
[CODE]
//+------------------------------------------------------------------+
//| _TRO_00_Lines |
//| |
//| |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightGray
#property indicator_color2 LightGray
#property indicator_color3 LightGray
// indicators parameters
//---- buffers
double P1Buffer[];
double P2Buffer[];
double P3Buffer[];
double xPrice ;
int myStyle = 2 ;
int myWingDing = 250 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0, P1Buffer);
SetIndexBuffer(1, P2Buffer);
SetIndexBuffer(2, P3Buffer);
SetIndexArrow(0, myWingDing);
SetIndexArrow(1, myWingDing);
SetIndexArrow(2, myWingDing);
SetIndexStyle(0, DRAW_ARROW, myStyle, 1);
SetIndexStyle(1, DRAW_ARROW, myStyle, 1);
SetIndexStyle(2, DRAW_ARROW, myStyle, 1);
SetIndexEmptyValue(0,0);
SetIndexEmptyValue(1,0);
SetIndexEmptyValue(2,0);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, dayi, counted_bars = IndicatorCounted();
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars;
//----
for(i = limit - 1; i >= 0; i--)
{
if ( Point == 0.01 ) {xPrice = Close - MathMod(Close,1.00) ; }
else { xPrice = Close - ( MathMod(100*Close,1.00)*0.01 ) ; }
P1Buffer = xPrice + Point*100;
P2Buffer = xPrice ;
P3Buffer = xPrice - Point*100;
} // for
return(0);
} // startНо мне он нужен для эксперта!
Кодеры, пожалуйста, помогите
Что нужно изменить в коде для перемещения большего количества точек вверх и вниз от свечей?
Возможно, кто-то действительно поможет вам, если вы опубликуете код.
Lux
Вот индикатор
Индикатор вы можете изменить код для перемещения точек вверх и вниз
правильное использование Time[]
Я неплохой программист, но новичок в mql4. Я работаю над экспертным советником для торговли в боксах (он же торговля на прорывах). По сути, он должен находить самые высокие и самые низкие значения для определенного таймфрейма, и когда свеча закрывается за пределами этой коробки, я размещаю сделку.
По сути, есть три состояния, в которых я могу запустить советника
1) после закрытия предыдущего дня и до времени начала бокса.
2) после начала бокса, но до его окончания.
3) после окончания бокса.
Что меня смущает, так это массив Time[], потому что индекс постоянно меняется. Предположим, я вхожу в состояние 2. В функции init я собирался установить глобальную переменную, задающую положение начала ящика. По мере поступления котировок моя функция start будет постоянно вызываться, и по достижении времени конца ящика у меня будут начальная и конечная позиции. Конечно, это не так, поскольку индекс в массиве Time продолжает двигаться вперед.
В лучшем случае я могу продолжать увеличивать позицию начального индекса ящика, но это не кажется очень чистым способом.
Если у вас есть предложения о том, как я должен изменить свое мышление от традиционного c/c++ к mql4, я буду рад их услышать.
Также, когда я закончу, я бы очень выиграл от проверки кода более старшим программистом. Кто-нибудь хочет стать добровольцем для этого?
Спасибо за ваше время,
Маркус
Я неплохой программист, но новичок в mql4. Я работаю над экспертным советником для торговли в боксах (также известной как торговля на прорывах). По сути, он должен находить самые высокие и самые низкие значения для определенного таймфрейма, и когда свеча закрывается за пределами этой коробки, я размещаю сделку.
По сути, есть три состояния, в которых я могу запустить своего советника
1) после закрытия предыдущего дня и до времени начала бокса.
2) после начала бокса, но до его окончания.
3) после окончания бокса.
Что меня смущает, так это массив Time[], потому что индекс постоянно меняется. Предположим, я вхожу в состояние 2. В функции init я собирался установить глобальную переменную, задающую положение начала ящика. По мере поступления котировок моя функция start будет постоянно вызываться, и по достижении времени конца ящика у меня будут начальная и конечная позиции. Конечно, это не так, поскольку индекс в массиве Time продолжает двигаться вперед.
В лучшем случае я могу продолжать увеличивать позицию начального индекса ящика, но это не кажется очень чистым способом.
Если у вас есть предложения о том, как я должен изменить свое мышление от традиционного c/c++ к mql4, я буду рад их услышать.
Также, когда я закончу, я бы очень выиграл от проверки кода более старшим программистом. Кто-нибудь хочет стать добровольцем для этого?
Спасибо за ваше время,
МаркусЗдравствуйте. Функция Time[] не изменяется постоянно - она изменяется только в конце текущего бара графика. TimeCurrent() же возвращает постоянно меняющееся значение (хотя и с разрешением в 1 секунду).
Вы можете получить точное время любого бара и таймфрейма, используя iTime(). Есть довольно много способов сделать это...
открытие двух ордеров в одно и то же время (проблема...)
Здравствуйте, я не знаю почему в некоторых опционах скрипт открывает два ордера в одно и то же время.
Кто-нибудь может помочь мне с этим, пожалуйста
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,EAName, MagicNo, 0,Green);
else
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,EAName, MagicNo, 0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else Print("Ошибка при открытии ордера BUY : ",GetLastError());
спасибо
Помогите с кодом
Привет всем,
Я хотел бы написать индикатор для вычисления значения закрытия, которое создает разворот индикатора типа HMA. Для этого мне нужно создать функцию для вычисления одного значения HMA с вкладкой значений закрытия, где я изменяю текущее значение в дихотомическом цикле, чтобы найти значение, которое создает разворот.
Кто-нибудь может помочь мне с моей функцией ComputeHull?
Вот мой код, без исследования дихотомии, это просто простой индикатор HMA с функцией computeHull, индикатор отображается, но он смещен вниз.
С уважением
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
//---- входные параметры
extern int HullAntPeriod=12;
//---- буферы
double TempBuf1[];
double TempBuf2[];
double HullAntBuf[];
//переменная
int HalfHullAntPeriod;
int SqrtHullAntPeriod;
//+------------------------------------------------------------------+
//| Специфические функции |
//+------------------------------------------------------------------+
double ComputeHull(int ActualBar)
{
double CloseTemp[];
double Temp[];
double Temp1, Temp2;
double result = -1;
int i;
//Копируем значения закрытия в CloseTemp
ArrayResize(CloseTemp, HullAntPeriod+SqrtHullAntPeriod);
ArrayCopy(CloseTemp, Close, 0, ActualBar, HullAntPeriod+SqrtHullAntPeriod);
ArraySetAsSeries(CloseTemp, true);
ArrayResize(Temp, SqrtHullAntPeriod);
//вычисление значения HMA
for(i=0; i<SqrtHullAntPeriod; i++)
{
Temp1 = iMAOnArray(CloseTemp, 0, HalfHullAntPeriod, 0, MODE_LWMA, i);
Temp2 = iMAOnArray(CloseTemp, 0, HullAntPeriod, 0, MODE_LWMA, i);
Temp = 2*Temp1-Temp2;
}
ArraySetAsSeries(Temp, true);
result = iMAOnArray(Temp, 0, SqrtHullAntPeriod, 0, MODE_LWMA, 0);
//---- сделано
return(result);
}
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
//---- 1 дополнительные буферы используются для временных данных.
IndicatorBuffers(3);
//---- настройки рисования
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_NONE);
//---- отображение 2 индикаторных буферов
SetIndexBuffer(0,HullAntBuf);
SetIndexBuffer(1,TempBuf1);
SetIndexBuffer(2,TempBuf2);
//---- имя для DataWindow и метки подокна индикатора
IndicatorShortName("HULL ANTICIP("+HullAntPeriod+")");
SetIndexLabel(0, "HULL ANTICIPATION");
SetIndexLabel(1,NULL);
SetIndexLabel(2,NULL);
//---- Инициализация специфического индикатора
HalfHullAntPeriod = MathFloor(HullAntPeriod/2);
SqrtHullAntPeriod = MathFloor(MathSqrt(HullAntPeriod));
//---- инициализация выполнена
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция деинициализации индикатора |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора |
//+------------------------------------------------------------------+
int start()
{
int bar, limit, i;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i=0; i<limit; i++)
HullAntBuf=ComputeHull(i);
//----
return(0);
}
//+------------------------------------------------------------------+
Почему это не работает?
double Place;
int Start()
{
Highest=iHighest(Symbol(),0,MODE_HIGH,1,0);Place=iHigh(Symbol(),0,Highest);
if(Gate==0){
if(iClose(Symbol(),0,0)>=Place){
OrderModify(ticket3,Ask,Ask-TrailingStop*Point-Spread,0,0,Green);
Gate=1;}
return(0);
}Я получаю ошибки. Я не могу сделать простой трейлинг-стоп!!!!!!!.