Спрашивайте! - страница 88

 
 

Спасибо, Ральф, я попробовал это, но потом он выдал еще один список ошибок - сказал, что все переменные в включающем файле не определены - но они определены.

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

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

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

Спасибо за помощь,

Кевин

ralph.ronnquist:
@pgtips: измените вторую строку, чтобы она была только
#define MAGIC 20051120
, т.е. без знака равенства и запятой.
 

Пытаюсь научиться программированию

Прежде всего, я прочитал весь курс Corder's Guru и нашел его очень интересным. Я пришел к выводу, что единственный разумный способ опробовать стратегию - это написать программу, чтобы убедиться в ее полной точности. К сожалению, я полный новичок, когда дело доходит до этого.

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

Все, что я пытаюсь сделать на данный момент, это отследить самую низкую цену (CurrentLow), а затем, когда она отступит на определенную величину (Ret1), разместить ордер на продажу с TP от нижней точки.

Пожалуйста, не смейтесь, но вот что я написал на данный момент:

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

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

return(0);

}

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

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

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

int start()

{

int ticket=0;

if(Bars<100)

{

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

return(0);

}

double CurrentLow,CurrentHigh;

if(Bid < CurrentLow)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

return (0);

}

return (0);

}

return (0);

}

}

 
Putz:
Прежде всего, я прочитал весь курс Corder's Guru и нашел его очень интересным. Я пришел к выводу, что единственный разумный способ опробовать стратегию - это написать программу, чтобы убедиться в ее полной точности. К сожалению, я полный новичок, когда дело доходит до этого.

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

Все, что я пытаюсь сделать на данный момент, это отследить самую низкую цену (CurrentLow), а затем, когда она отступит на определенную величину (Ret1), разместить ордер на продажу с TP от нижней точки.

Пожалуйста, не смейтесь, но вот что я написал на данный момент:

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

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

return(0);

}

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

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

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

int start()

{

int ticket=0;

if(Bars<100)

{

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

return(0);

}

double CurrentLow,CurrentHigh;

if(Bid < CurrentLow)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

return (0);

}

return (0);

}

return (0);

}

}

Кажется неправильным проверять, если Bid > CurrentHigh внутри истинного условия, что Bid < CurrentLow; я считаю, что вы должны иметь независимые тесты, подобные этому:

double CurrentLow,CurrentHigh;

int start()

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid > CurrentHigh) CurrentHigh = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point),"Albatross_v1",757575,0,Green);

return(0);

}

Теперь три замечания:

- Вы должны объявить CurrentHigh и CurrentLow на глобальном уровне, то есть вне любой функции (а start() - это функция), иначе эти переменные будут инициализироваться в 0 при каждом вызове функции.

- Вам не нужна CurrentHigh, так как она не используется.

- Вы должны реализовать некоторую логику для сброса/обновления значения CurrentLow, и, возможно, для ограничения открытия ордеров на каждом тике выше CurrentLow+(Point*Ret1)).

 

Здравствуйте, Мишель,

Большое спасибо за ваш быстрый ответ и помощь.

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

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

Я уверен, что вернусь сюда с новыми вопросами.

Еще раз спасибо.

Putz

 
Putz:
Привет, Мишель,

Большое спасибо за быстрый ответ и помощь.

Я удалил CurrentHigh и теперь понимаю намного лучше. Я также определил CurrentLow в верхней части программы, и теперь она действительно размещает ордера.

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

Я уверен, что вернусь сюда с новыми вопросами.

Еще раз спасибо.

Putz

Не забудьте инициализировать CurrentLow большим значением (например, 1000); если его инициализировать 0, у вас никогда не будет Bid < 0.

 

Какой язык программирования мне изучать?

codersguru:
Здравствуйте, друзья,

У меня много личных сообщений с просьбой помочь с некоторыми фрагментами кода.

Здесь вы можете задавать свои вопросы, связанные с MQL4, и я постараюсь ответить на них.

Уважаемые кодерсгуру,

Если я хочу научиться писать коды на MQL4, какой язык программирования мне изучать? Visual basic или C++? Спасибо за ответ.

 

Помогите, пожалуйста

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

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

Я пытаюсь сделать два ордера.

1) Продать 0.1 лот, как только цена отступит на Ret1 (75 пунктов) с TP1 (75) и SL1 (150).

2) Продать 0.2 лота, как только цена отступит от Ret2 (150 пунктов) с TP1 (75) и SL1 (75).

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

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

extern string Expert_Name = "Albatross v1";

extern int MagicNumber = 757575;

extern int Slippage = 3.0;

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

extern double TP1=75.0;

extern double TP2=75.0;

extern double Ret1=75.0;

extern double Ret2=150.0;

extern double SL1=150.0;

extern double SL2=75.0;

extern double Lots=0.1;

double CurrentLow=1000;

//double CurrentHigh=0;

int OpenOrders=0,cnt=0;

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

//| Пользовательская функция инициализации индикатора |

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

//int init()

// {

//---- индикаторы

//----

// return(0);

// }

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

//| Пользовательская функция деинициализации индикатора | |

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

// int deinit()

// {

//---- TODO: добавьте свой код сюда

//----

// return(0);

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

//| Пользовательская функция итерации индикатора |

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

// int start()

// {

//---- TODO: добавьте свой код сюда

//----

// return(0);

// }

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

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

return(0);

}

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

//| Проверка контроля открытого положения |

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

int CheckOpenTrades()

{

int cnt;

int NumTrades; // Количество сделок на покупку и продажу по данному символу

NumTrades = 0;

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)

{

OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() != Symbol()) continue;

if ( OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == OP_BUY ) NumTrades++;

if(OrderType() == OP_SELL ) NumTrades++;

}

return (NumTrades);

}

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

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

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

int start()

{

int cnt, ticket, total;

двойной TP;

if(Bars<100)

{

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

return(0);

}

total = CheckOpenTrades();

if(total < 1)

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",MagicNumber,0,Green);

}

if(total < 2)

{

if(Bid >= CurrentLow+(Point*Ret2))

OrderSend(Symbol(),OP_SELL,Lots*2,Bid+(Point*Ret2),3,Bid+(SL2*Point),Bid-(TP2*Point), "Albatross_v1",MagicNumber,0,Green);

return(0);

}

}

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

 

Извините, что беспокою вас этим вопросом

Как создать объект, который заполняется цветом?

Дэйв

<<<

 

Привет всем, я кодер и уже давно кодирую на C++, но мои знания FX и MQL4 очень базовые. Я изучаю советник, который кто-то написал, и пытаюсь понять код...

Не могли бы вы объяснить мне простым английским языком, что такое параметр SHIFT в методе iMA?

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

согласно справке MT4, это "Индекс значения, взятого из буфера индикатора (сдвиг относительно текущего бара на заданное количество периодов назад)." - Что такое буфер индикатора?

Он также делает следующее...

int RealTime = 0;

if( UseCompletedBars )

{

if(timeprev==Time[0]){return(0);} timeprev = Time[0];

RealTime = 1;

}

double MA11 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,0+RealTime);

double MA12 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,1+RealTime);

double MA21 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,0+RealTime);

double MA22 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,1+RealTime);

if( MA11 > MA21 && MA12 < MA22 ) { EnterLong = True; }

if( MA11 MA22 ) { EnterShort = True; }

Что это вернет? Поскольку я не знаю сдвиг, я думаю, поэтому я не могу получить его ...

Ваш ответ будет высоко оценен.

пожалуйста, помогите.