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

 

Можно ли добавить цвет, стиль и вес к линиям уровней индикатора?

Здравствуйте,

Я хотел бы узнать, может ли кто-нибудь сказать мне, возможно ли добавить цвет, стиль и вес к линиям уровней индикатора?

Для начала я хотел бы задать стиль и цвет уровням RSI и хотел бы узнать, можно ли это сделать, добавив дополнительный код, например, к строке: #property indicator_level1 70 ?

Если это возможно, я был бы очень признателен, если бы кто-нибудь показал мне.

Спасибо,

Лаурус

 

...

Да, вы можете

Используйте следующие свойства:

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
Привет,

Мне интересно, может ли кто-нибудь сказать мне, возможно ли добавить цвет, стиль и вес к линиям уровней индикатора?

Для начала я хотел бы задать стиль и цвет уровням RSI и хотел бы узнать, можно ли это сделать, добавив дополнительный код, например, к строке: #property indicator_level1 70 ?

Если это возможно, я был бы очень признателен, если бы кто-нибудь показал мне.

Спасибо,

Лавр
 

Спасибо за ваш ответ, Младен, ваша помощь всегда очень ценится.

То, что вы написали, это именно то, чего я боялся. Когда дело доходит до функциональной части, это все еще выше моих сил.

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

Спасибо,

Laurus

Файлы:
 

...

Глядя на ваш рисунок, кажется, что это единственное решение, которое вы можете применить (использование объектов). Использование буферов рисования просто опустошило бы ваши буферы рисования, и вы не смогли бы нарисовать все значения, которые вы используете на этом индикаторе. Иногда мы все еще "платим" за решение metatraders 4 иметь только 8 буферов рисования.

Laurus12:
Спасибо за ваш ответ, Младен, ваша помощь всегда очень ценится.

То, что вы написали, это именно то, чего я боялся. Когда дело доходит до функциональной части, это все еще выше моих сил.

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

Спасибо,

Laurus
 

Внешняя DLL возвращает странные результаты

Здравствуйте!

Ниже приведен очень простой пример вызова внешней DLL. При использовании с тестером стратегий журнал должен показывать возрастающие числа, начиная с 0.

Однако результат довольно странный. Первая строка в журнале отображает большое число (т.е. 18472), а затем некоторое время увеличивается, пока не начинает прыгать примерно на 10, иногда более 100 шагов одновременно.

Может ли кто-нибудь объяснить мне причину этого и как это исправить?

Спасибо!

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

интересная проблема с кодом для индикатора

Привет, ребята,

Я пытаюсь изучить программирование MT4, и в данный момент я разрабатываю индикатор обнаружения PinBar, который говорит мне покупать или продавать. Я разработал этот индикатор специально для 4-часового графика, потому что там есть специальные правила для покупки или продажи. Правило для обнаружения следующее:

Тело свечи <= 35% от длины свечи.

Хотя бы 1 фитиль свечи >= 50% длины свечи.

До сих пор у меня не было проблем с обнаружением этих баров с помощью индикатора.

Однако следующее правило говорит мне покупать или продавать.

Я увеличиваю масштаб часового графика и смотрю на 4 бара, которые создали пинбар на 4-часовом графике.

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

Однако... как запрограммировано сейчас, я всегда смотрю на первую и последнюю свечу на самом часовом графике. И это не нормально. Это должен быть первый и последний бар формации, а не графика.

Вот код, который у меня сейчас есть с неправильными функциями iClose.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

Buy = Close;

SetLevel(true,i+1,Close);

}

Я не смог найти правильные часовые свечи в фоне этой конкретной 4-часовой свечи.

Может быть, кто-то может дать мне ответ на мою проблему?

исправил:

datetime H4BarTime;

int H1BarNumber;

H4BarTime = Time;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

спасибо большое!

Джейкоб

 
mladen:
Глядя на ваш рисунок, кажется, что это единственное решение, которое вы можете применить (использование объектов). Использование буферов рисования просто опустошило бы ваши буферы рисования, и вы не смогли бы нарисовать все значения, которые вы используете на этом индикаторе. Иногда мы все еще "платим" за решение metatraders 4, чтобы иметь только 8 буферов рисования .

Извините за мой поздний ответ, Младен, и спасибо за разъяснение вопроса. Что касается того, что вы написали, по крайней мере, теперь я знаю наверняка.

Спасибо,

Laurus

 

Помогите с критериями поступления

Привет, ребята,

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

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

Я занимаюсь этим уже несколько дней без какого-либо прогресса. Может ли кто-нибудь пролить свет на то, как мне это сделать? Спасибо.

//--- входные параметры

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| функция инициализации эксперта |

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

int init()

{

//----

//----

return(0);

}

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

//| функция деинициализации эксперта | |

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_dirction = 0;

if(line1>line2)current_dirction = 1; //up

if(line1<line2)current_dirction = 2; //вниз

if(current_dirction != last_direction) //changed

{

last_dirction = current_dirction;

return (last_direction);

}

else

{

return (0);

}

}

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

//| функция запуска эксперта |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0); // проверяем TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Мой советник",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print(" Открытордер SELL: ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Спасибо и пожелания

Терранс

 

...

Терранс

Попробуйте изменить эти строки:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

Таким образом, вам даже не понадобится функция crossed, и она будет проверять пересечения на закрытом баре.

tkuan77:
Привет, ребята,

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

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

Я занимаюсь этим уже несколько дней без какого-либо прогресса. Может ли кто-нибудь пролить свет на то, как мне это сделать? Спасибо.

//--- входные параметры

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| функция инициализации эксперта |

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

int init()

{

//----

//----

return(0);

}

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

//| функция деинициализации эксперта | |

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_dirction = 0;

if(line1>line2)current_dirction = 1; //up

if(line1<line2)current_dirction = 2; //вниз

if(current_dirction != last_direction) //changed

{

last_dirction = current_dirction;

return (last_direction);

}

else

{

return (0);

}

}

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

//| функция запуска эксперта |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0); // проверяем TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Мой советник",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер SELL : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Спасибо и пожелания

Терранс
 
mladen:
Терранс

Попробуйте изменить эти строки:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

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

Привет, Младен, я попробовал то, что вы мне сказали, и это творит чудеса. Однако я не совсем понимаю логику кодов. Почему вы устанавливаете сдвиг iMA на 1 и 2 и почему вы кодируете это: (diff1*diff2)<0)? Извините, но я все еще нахожусь в процессе обучения.

Спасибо и пожелания

Терранс

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