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

 
lincoln2012:
Я пытаюсь изучить MQ4. Моя первая простая программа должна выдавать алерт, когда 2 MA пересекаются. Я не могу понять, почему

этот код не работает.

Любая помощь будет очень признательна! Заранее спасибо.

extern int Period_MA1 = 5;

extern int Period_MA2 = 1;

double MA1;

double MA2;

int init()

{

return(0);

}

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

int deinit()

{

return(0);

}

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

int start()

{

//--------------------------------------------------------------------

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0);

MA2=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0);

//--------------------------------------------------------------------

if (MA2 == MA1 )

Alert("Цена такая же(",Period_MA2,").");// Alert

возврат;

}

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

Не могли бы вы посмотреть код этого Ma Cross.

Файлы:
macross-1.mq4  7 kb
 
lincoln2012:
Я пытаюсь изучить MQ4. Моя первая простая программа должна выдавать алерт, когда 2 MA пересекаются. Я не могу понять, почему

этот код не работает.

}

Ключ к коду пересечения любых 2 линий индикатора заключается в следующем:

1. Если линия текущего бара1>линии2, а линия предыдущего бара1<линии2, то происходит пересечение вверх.

2. Если линия текущего бара1<линии2, то происходит пересечение вниз.

 
mj10:
привет

Ну, я немного программировал в Mt4, это весело, но я не профессионал, просто простое редактирование старого индикатора. Я хочу сделать простой индикатор, но не знаю, как это сделать.

Это простой индикатор, он просто проверяет значение, если значение всех переменных одинаково, он рисует ту точку, где значение всех переменных совпадает.

мое простое решение

предположим, у нас есть переменные

double movingavg1;

double movingavg12;

double movingavg13;

double movingavg14;

double movingavg15;

double movingavg16;

double movingavg17;

double movingavg18;

double movingavg19;

double movingavg10;

double movingavgall;

объявляем переменную, я просто привожу пример, я использую iStochastic(1), но мы можем использовать любой индикатор.

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

и так далее

теперь

if (movingavg12=movingavg13=movingavg14,....) (помещаем значение в переменную "movingavgall") //помещаем значение, которое равно для vria

нарисовать movingavgall на барах

Приложение

предположим, я хочу проверить, где скользящая средняя 3 и скользящая средняя 5 имеют одинаковое значение.

даже этот индикатор можно использовать с RSI, где значение RSI 1 и RSI 2 = 80

и многое другое

Даже если мы добавим MTF, это будет дополнительным бонусом.

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

надеюсь, вы понимаете, о чем я говорю

спасибо

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

Дляпроверки равенства значений используется ==. Один = используется для присвоения значения переменной.

При проверке более чем 1 набора необходимо использовать && для обозначения AND

movingavgall = 0;

if ((a == b) && (b == c) && (c == d)) movingavgall = a;

Затем вы можете проверить, имеет ли movingavgall значение, с помощью функции

if (movingavgall != 0)

{

// сделайте что-нибудь здесь

}

Выполните поиск по программированию metatrader с помощью Google.

Вы должны найти несколько хороших учебников по программированию в MT4.

Хорошая книга по программированию на C также поможет.

Роберт Хилл aka MrPip

 

упростить этот код

привет всем!

Я пытаюсь упростить этот код, используя команду stringconcatenate из этого:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

к этому:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%", "/\\\ ", uitog2v, "%", "/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Надеюсь, кто-нибудь сможет мне помочь.

С наилучшими пожеланиями

док

trend_alexcud_v_2men.mq4

Файлы:
 

...

Doc

Если вам нужны все эти элементы, то нет более простого способа написать его

dr.house7:
привет всем!

Я пытаюсь упростить этот код, используя команду stringconcatenate:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

к этому:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%", "/\\\ ", uitog2v, "%", "/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Надеюсь, кто-нибудь сможет мне помочь.

С наилучшими пожеланиями

док

trend_alexcud_v_2men.mq4
 

Как: Оповещение каждые 60 секунд

Как я могу сделать код, который, например, выдает мне оповещение каждые 60 секунд?

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

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc Если вам нужны все эти элементы, то нет более простого способа написать их.

На этот раз не повезло, но все равно спасибо.

с наилучшими пожеланиями

doc

 

Существует проблема со вторым вызовом StringConcatenate.

Вы складываете 3 разных имени шрифта, и в результате не получается правильного имени.

Роберт

dr.house7:
привет всем!

Я пытаюсь упростить этот код, используя команду stringconcatenate из этого:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

к этому:

ObjectSetText("uitog1v", StringConcatenate("/\\\ ", uitog1v, "%", "/\\\ ", uitog2v, "%", "/\\\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Надеюсь, кто-нибудь сможет мне помочь.

С наилучшими пожеланиями

док

trend_alexcud_v_2men.mq4
 

Нужна помощь с советником... сделки не закрываются в тестере

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

Я опубликую часть кода моего советника, чтобы, возможно, кто-то из вас, опытных кодеров, смог понять, почему у меня возникла эта проблема. Значения 'buyTrade' и 'sellTrade' являются глобальными для всего советника.

ПРИМЕЧАНИЕ: Я хочу, чтобы в любой момент времени была открыта только ОДНА сделка, либо длинная, либо короткая. Сделки "всегда в деле", поэтому при появлении длинного сигнала, существующий короткий должен быть закрыт и наоборот.

Он НЕ делает этого. Что он делает, так это открывает сделки, а затем открывает больше сделок ... и открывает больше ... и держит их открытыми, пока все они в конечном итоге не достигнут своих стопов.

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

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Поскольку это неполный код: попробуйте заменить symBid на symAsk при закрытии ордера на продажу и symAsk на symBid при закрытии ордера на покупку (инвертируйте цены закрытия, вы не можете закрыть продажу по цене bid и не можете закрыть покупку по цене ask).

outofdebt:
Я работаю над советником, но что бы я ни делал, я не могу заставить его закрывать сделки. Он открывает их просто отлично, но когда я хочу их закрыть, советник не закрывает их.

Я опубликую часть кода моего советника, чтобы, возможно, кто-то из вас, опытных кодеров, смог понять, почему у меня возникла эта проблема. Значения 'buyTrade' и 'sellTrade' являются глобальными для всего советника.

ПРИМЕЧАНИЕ: Я хочу, чтобы в любой момент времени была открыта только ОДНА сделка, либо длинная, либо короткая. Сделки "всегда в деле", поэтому при появлении длинного сигнала, существующий короткий должен быть закрыт и наоборот.

Он НЕ делает этого. Что он делает, так это открывает сделки, а затем открывает больше сделок ... и открывает больше ... и держит их открытыми, пока все они в конечном итоге не достигнут своих стопов.

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

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
Причина обращения: