Помощь в кодировании - страница 352

 
freakout:
здравствуйте,

уважаемый mladen, у меня к Вам небольшая просьба - не могли бы Вы отключить всю информацию, которую показывает в левом верхнем углу прикрепленный ниже индикатор?

заранее спасибо ;-)

Сделал опцию включения/выключения комментариев.

Файлы:
 
paradise77:
Привет,

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

Заранее спасибо.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 clrLime

#property indicator_width1 2

#property indicator_color2 clrMagenta

#property indicator_width2 2

extern int EMA1 = 3;

extern int EMA2 = 21;

extern int EMA3 = 63;

extern double arrowDistance = 0.0003;

extern color upRectColor = clrYellow;

extern color dnRectColor = clrDodgerBlue;

extern color touchRectColor = clrDarkGray;

//---

extern double rectHigh = 0.0001;

extern int rectDays = 3;

extern int bars_limit = 2000;

extern bool showRectangle = true;

double upArrow[];

double dnArrow[];

double prev2EMA1, prev2EMA2, prev2EMA3;

double prevEMA1, prevEMA2, prevEMA3;

double curEMA1, curEMA2, curEMA3;

double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;

string objRectName;

string rectArray[];

string indiName = "Emac";

int rectValidity = 0;

int arrayMaxAmounts = 99999;

int arrayCurAmount = 0;

int arrayLastAmount = 0;

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

//| INIT() |

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

int init() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);

IndicatorBuffers(2);

SetIndexBuffer(0,upArrow);

SetIndexBuffer(1,dnArrow);

SetIndexStyle(0,DRAW_ARROW);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexArrow(1,234);

SetIndexEmptyValue(0,0.0);

SetIndexEmptyValue(1,0.0);

SetIndexLabel(0,"Up");

SetIndexLabel(1,"Dn");

return(0);

}

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

//| DEINIT() |

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

int deinit() {

int k=0;

while (k<ObjectsTotal()) {

string objname = ObjectName(k);

if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")

ObjectDelete(objname);

else

k++;

}

return(0);

}

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

//| START() |

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

int start() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

int limit,i,k;

int counted_bars=IndicatorCounted();

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//---

if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;

if (Bars<EMA1 || Bars<EMA2 || Bars0 && bars_limit0 && bars_limit0 && bars_limit<EMA3)) {

Alert("Adjust limit settings or put more bars on your chart!");

return(0);

}

//---

for (i=0; i<limit; i++) {

prev2EMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);

prevEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);

curEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

curEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

curEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);

prevOpenPrc = iOpen(NULL,0,i+1);

prevClosePrc = iClose(NULL,0,i+1);

prevLowPrc = iLow(NULL,0,i+1);

prevHighPrc = iHigh(NULL,0,i+1);

rectValidity = rectDays*86400;

if ( (prev2EMA1=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) { // up

upArrow = prevLowPrc - arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time,prevLowPrc,Time+rectValidity,prevLowPrc+rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$up$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) { // down

dnArrow = prevHighPrc + arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time,prevHighPrc,Time+rectValidity,prevHighPrc-rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$dn$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

} // for

//----------------------- Edit Rectangle, change time2 & color, if price touched ----------------------

return(0);

} // start

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

void DelObjects(string id) {

int ot1=ObjectsTotal();

while(ot1>=0) {

if (StringFind(ObjectName(ot1),id,0)>-1) {

ObjectDelete(ObjectName(ot1));

}

ot1--;

}

return;

}

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

string FuncPeriodToStr(int thePeriod) {

switch(thePeriod) {

case 1: return("M1");

case 5: return("M5");

case 15: return("M15");

case 30: return("M30");

case 60: return("H1");

case 240: return("H4");

case 1440: return("D1");

case 10080: return("W1");

case 43200: return("MN1");

default: return("MN1");

}

}

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

@Mladen,

Не могли бы вы мне подсказать, как редактировать прямоугольник?

Я нашел следующее:

*) Типы объектов - Документация по MQL4

*) Свойства объектов - Документация MQL4

Я могу получить свойства прямоугольника (time1, price1, time2, price2, color), затем сравнить price1 или price2 с текущей ценой Ask/Bid. Если цена Ask/Bid коснется цены price1 или price2, то нужно сделать следующее:

a) Мне не нужен массив, я просто смотрю на каждый объект прямоугольника.

Удалите объект, создайте его снова, используя new time2 и newcolor.

б) Как узнать положение свечи на OBJPROP_PRICE1? Обычно мы используем цикл "for", например

for (i=limit; i>0; i--)

Как мы можем получить "i" бара, который имеет цену1?

в) Если я не буду удалять и создавать прямоугольник заново, могу ли я просто использовать ObjectSet для изменения времени2 и цвета прямоугольника?

Спасибо.

 
paradise77:
@Mladen,

Не могли бы вы мне подсказать, как редактировать прямоугольник ?

Я нашел следующее :

*) Типы объектов - Документация по MQL4

*) Свойства объектов - Документация MQL4

Я могу получить свойства прямоугольника (time1, price1, time2, price2, color), затем сравнить price1 или price2 с текущей ценой Ask/Bid. Если цена Ask/Bid коснется цены price1 или price2, то нужно сделать следующее:

a) Мне не нужен массив, я просто смотрю на каждый объект прямоугольника.

Удалите объект, создайте его снова, используя new time2 и newcolor.

b) Как узнать положение свечи на OBJPROP_PRICE1? Обычно мы используем цикл "for", например

как мы можем получить "i" бара, который имеет цену1?

c) Если я не буду удалять и создавать заново прямоугольник, могу ли я просто использовать ObjectSet для изменения времени2 и цвета прямоугольника?

Спасибо.

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

 

Cosmiclifeform,

Спасибо за эту статью, на самом деле я использовал instaforex demo. Я загрузил 1M цены fiest как обычный метод. Я затем делаю настройки, используя EURUSD, см. снимки экрана ниже вкладки отчета и журнала...

//reports, noting but zerp, why?

cosmiclifeform:
Привет, Мастеркэш,

Я запустил советника на демо-счете FXDD... и не сделал ничего особенного... просто запустил советника в тестере стратегий с настройками по умолчанию.

Хотелось бы помочь больше... но без конкретных подсказок (журналы ошибок, снимки экрана и другие условия) невозможно выяснить, почему вы получаете пустые результаты.

Все, что я могу порекомендовать, это...

Сначала попробуйте в тестере хороший советник, который, как вы знаете, работает нормально.

Это позволит убедиться, что и ваши демо-счета, и ваши процедуры в порядке.

Сначала получите уверенность в том, что все работает так, как должно работать.

Затем попробуйте свой хороший советник... и запишите, что именно происходит. Даже на пустом экране должны быть журналы для проверки.

Попробуйте добавить утверждения PRINT и COMMENT везде... затем снова проверьте журналы... как на вкладке советника, так и на вкладке журнала...

Также ваши КОММЕНТЫ будут отображаться на экране... так что вы должны видеть, работает ваш советник или нет.

Суть в том, чтобы получить хорошую помощь в кодировании...

это дать как можно больше подсказок о том, что происходит с вашим советником...

Продолжайте пробовать все возможное... и сообщите нам о результатах.

Берегите себя,

Роберт
Файлы:
backtest1.png  14 kb
backtest2.png  3 kb
 
mladen:
В вашем случае ваши цены в порядке. Вы должны использовать время для ограничения ящиков слева и справа.

Спасибо, Младен. Вы имеете в виду, что я должен использовать Time2 динамически? Time1, price1 и price2 фиксированы. Но Time2 зависит от текущего бара (i), и движется, пока цена не коснется прямоугольника, или это больше, чем время установки прямоугольника по умолчанию.

Другими словами, невозможно изменить цвет и время2 прямоугольника?

Спасибо

 
paradise77:
Спасибо mladen. Вы имеете в виду, что я должен использовать Time2 динамически? Time1, price1 и price2 фиксированы. Но Time2 зависит от текущего бара (i), и движется, пока цена не коснется прямоугольника, или пока она не превысит время установки прямоугольника по умолчанию.

Другими словами, невозможно изменить цвет и время2 прямоугольника?

Спасибо

paradise77

Да, вы должны.

Таким образом вы всегда будете корректировать правую границу бокса (если она нуждается в корректировке, конечно).

 

Здравствуйте, господа Младен и Mrtools.

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

Но есть одно оповещение, которое я хотел бы иметь, это когда "мой" SSA + MA пересекается с MA, либо вверх, либо вниз.

Еще одна вещь, я всегда добавляю три уровня к этому чудесному инструменту; конечно, нулевой уровень, 0.0, а также -0.3 и 0.3.

Я хотел бы также получить оповещение, когда SSA пересекает уровень -0.3 и 0.3. Уровень 0.0 не является необходимым.

В качестве оповещения простой звук и всплывающее окно, вот и все.

Спасибо!

Файлы:
ssa__ma.mq4  5 kb
 
Wulong10:
Здравствуйте господа Mladen и Mrtools.

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

Но есть одно оповещение, которое я хотел бы иметь, это когда "мой" SSA + MA пересекается с MA, либо вверх, либо вниз.

Еще одна вещь, я всегда добавляю три уровня к этому чудесному инструменту; конечно, нулевой уровень, 0.0, а также -0.3 и 0.3.

Я хотел бы также получить оповещение, когда SSA пересекает уровень -0.3 и 0.3. Уровень 0.0 не является необходимым.

В качестве оповещения простой звук и всплывающее окно, вот и все.

Спасибо!

Wulong10

Дело в том, что SSA - это пересчитывающий алгоритм. Добавлять к нему алерты, по крайней мере, я так считаю, неразумно, так как он будет постоянно менять место пересечений, а иногда пересечения будут исчезать совсем. Лучше использовать его в несигнальном режиме (только оценка).

 

Привет, Младен,

Я знаю, что SSA пересчитывает на более высоких таймфреймах.

Когда я использую его на M5, он немного меняется, на M15 намного больше, но на M1 я много раз тестировал этот инди и очень им доволен. С моими настройками он действительно не сильно адаптируется, на самом деле он очень точен.

Конечно, когда цена долго растет или долго падает, он не очень надежен, но разве это не так со многими индикаторами?

Тогда вы используете простую скользящую среднюю на графике для подстраховки...

Может быть, кто-то еще не может использовать алерты, но я могу.

Сигналы CCI тоже не всегда верны, но это лишь указание на то, что может произойти дальше.

Так что, если SSA даст предупреждение, я сам должен решить, что с этим делать, и у меня это хорошо получается.

Кроме того, думаю, я не единственный, кому нравится SSA ...

Кресты, которые исчезают? Не очень часто на M1, а я наблюдаю за этим графиком уже несколько дней...

Так что, я бы очень хотел получать оповещения, если это возможно.

Данке шён!

 
Wulong10:
Привет, Младен,

Я знаю, что SSA пересчитывает на более высоких таймфреймах.

Когда я использую его на M5, он немного меняется, на M15 - намного больше, но на M1 я много раз тестировал этот инди и очень им доволен. С моими настройками он действительно не сильно адаптируется, на самом деле он очень точен.

Конечно, когда цена долго растет или долго падает, он не очень надежен, но разве это не так со многими индикаторами?

Тогда вы используете простую скользящую среднюю на графике для подстраховки...

Может быть, кто-то еще не может использовать алерты, но я могу.

Сигналы CCI тоже не всегда верны, но это лишь указание на то, что может произойти дальше.

Так что, если SSA даст предупреждение, я сам должен решить, что с этим делать, и у меня это хорошо получается.

Кроме того, думаю, я не единственный, кому нравится SSA ...

Кресты, которые исчезают? Не очень часто на M1, а я наблюдаю за этим графиком уже несколько дней...

Так что, я бы очень хотел получать оповещения, если это возможно.

Данке шён!

Wulong10

SSA всегда пересчитывается (поверьте мне, так как именно я создал dll для его расчета). Исключений из этого правила нет (не имеет значения, на каком временном интервале вы его используете).

Также, если число вычислений установлено > 1, он будет пересчитывать все бары. Если число вычислений установлено на 1, то будут пересчитаны по крайней мере "запаздывающие" бары.