Как кодировать? - страница 62

 
Dan7974:
Как я могу закодировать это?

Если рынок коснется (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
 

Но мне он нужен для эксперта!

 

Кодеры, пожалуйста, помогите

Что нужно изменить в коде для перемещения большего количества точек вверх и вниз от свечей?

Файлы:
diagram.gif  18 kb
 

Возможно, кто-то действительно поможет вам, если вы опубликуете код.

Lux

 

Вот индикатор

Индикатор вы можете изменить код для перемещения точек вверх и вниз

Файлы:
 

правильное использование Time[]

Я неплохой программист, но новичок в mql4. Я работаю над экспертным советником для торговли в боксах (он же торговля на прорывах). По сути, он должен находить самые высокие и самые низкие значения для определенного таймфрейма, и когда свеча закрывается за пределами этой коробки, я размещаю сделку.

По сути, есть три состояния, в которых я могу запустить советника

1) после закрытия предыдущего дня и до времени начала бокса.

2) после начала бокса, но до его окончания.

3) после окончания бокса.

Что меня смущает, так это массив Time[], потому что индекс постоянно меняется. Предположим, я вхожу в состояние 2. В функции init я собирался установить глобальную переменную, задающую положение начала ящика. По мере поступления котировок моя функция start будет постоянно вызываться, и по достижении времени конца ящика у меня будут начальная и конечная позиции. Конечно, это не так, поскольку индекс в массиве Time продолжает двигаться вперед.

В лучшем случае я могу продолжать увеличивать позицию начального индекса ящика, но это не кажется очень чистым способом.

Если у вас есть предложения о том, как я должен изменить свое мышление от традиционного c/c++ к mql4, я буду рад их услышать.

Также, когда я закончу, я бы очень выиграл от проверки кода более старшим программистом. Кто-нибудь хочет стать добровольцем для этого?

Спасибо за ваше время,

Маркус

 
mweltin:
Я неплохой программист, но новичок в 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);

}

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

 

Почему это не работает?

int Highest;

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

}

Я получаю ошибки. Я не могу сделать простой трейлинг-стоп!!!!!!!.

Причина обращения: