Оформите весь цикл в функцию, и возвращайте из неё номер бара если найден, либо WRONG_VALUE - если не найден.
Добрый день. Закончил кажется работать со вчерашней проблемной iCustom. Оформил всё в виде функции, для контроля применил "Comment" и "Print".
Смысл данного пробного советника в том, что-бы отлавливать сигналы в виде стрелок Вверх/Вниз от индикатора iCrossAD и превращать их в команду BUY или SELL, которая будет использоваться в будующей программе.
Опыта у меня маловато, потому прошу строго не судить, а вот аргументированная критика и советы, как было лучше сделать - приветствуются.
Собственно ради этого и писал пост. Файлы советника и индикатора прилагаю, код ниже.
//+------------------------------------------------------------------+//| Test_iCusom.mq5 |//| Copyright 2018, MetaQuotes Software Corp. |//| https://mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://mql5.com/ru/users/artmedia70"#property version"1.00"#property description""#property strict//--- includes#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---enum Indicator_Direction
{
Direction_BUY,
Direction_SELL,
Direction_FLAT
};
//---inputstring Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----inputuint InpPeriodFind = 400; // Bars for calculateinputuint InpUnheckedBars = 2; // Unchecked barsinputuint InpPeriodIND = 21; // CCI period//--- global variables
CEngine engine;
CTrade trade;
CPositionInfo apos;
CSymbolInfo asymbol;
int CrossAD; //Хэндл индикатора iCrossADdouble Buf_Arrow_Sell[], //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
Last_Arrow_Sell_volume, //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
Last_Arrow_Sell_index; //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossADdatetime Last_Arrow_Buy_time; //Переменная для записи времени стрелкиdouble Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
datetime Last_Arrow_Sell_time;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
ArraySetAsSeries(Buf_Arrow_Buy, true);
ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD",InpPeriodFind,InpUnheckedBars,InpPeriodIND);
if (CrossAD == INVALID_HANDLE)
{
Print("Не удалось создать описатель индикатора iCrossAD!");
return(INIT_FAILED);
}
elsePrint("Хендл iCrossAD = ",CrossAD);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- delete objectsObjectsDeleteAll(0,"",-1);
Comment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
string direction = "no information";
switch(iCustom_iCrossAD(InpPeriodFind))
{
case Direction_BUY: direction = "BUY";
break;
case Direction_SELL: direction = "SELL";
break;
case Direction_FLAT: direction = "FLAT";
break;
caseWRONG_VALUE: direction = "no information";
break;
}
Comment("-------------------------",
"\n Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,
"\n Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,
"\n Last_Arrow_Buy_time = ",Last_Arrow_Buy_time,
"\n ---------------------- ",
"\n Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,
"\n Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,
"\n Last_Arrow_Sell_time = ",Last_Arrow_Sell_time,
"\n ---------------------- ",
"\n Indicator_Direction = ",direction
);
}
//+------------------------------------------------------------------+int iCustom_iCrossAD(uint PeriodFind)
{
Indicator_Direction direct = Direction_FLAT;
if (CopyBuffer(CrossAD, 1, 0, PeriodFind, Buf_Arrow_Buy) != PeriodFind)
{
Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
return(WRONG_VALUE);
}
for(int n=0; n<(int)PeriodFind; n++)
{
if(n==0)
Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Buy[n]==EMPTY_VALUE)
Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
{
Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
Last_Arrow_Buy_time = iTime(_Symbol,0,n);
Last_Arrow_Buy_index = n;
Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
break;
}
}
if (CopyBuffer(CrossAD, 2, 0, PeriodFind, Buf_Arrow_Sell) != PeriodFind)
{
Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
return(WRONG_VALUE);
}
for(int n=0; n<(int)PeriodFind; n++)
{
if(n==0)
Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Sell[n]==EMPTY_VALUE)
Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
{
Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
Last_Arrow_Sell_time = iTime(_Symbol,0,n);
Last_Arrow_Sell_index = n;
Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Sell_time = ",Last_Arrow_Sell_time);
break;
}
}
if(Last_Arrow_Buy_index < Last_Arrow_Sell_index)direct = Direction_BUY;
elseif(Last_Arrow_Buy_index > Last_Arrow_Sell_index)direct = Direction_SELL;
else direct = Direction_FLAT;
return(direct);
//return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
Добрый день, есть в советнике функция удаления отложенных ордеров при срабатывании другого ордера. Как прописать во внешние параметры что бы можно было эту функцию отключать. Заранее благодарю.
Priffekt: Добрый день, есть в советнике функция удаления отложенных ордеров при срабатывании другого ордера. Как прописать во внешние параметры что бы можно было эту функцию отключать. Заранее благодарю.
DeleteOppositeOrders();
void DeleteOppositeOrders() {
bool fd, fep1, fep2;
fep1=ExistPosition(1);
fep2=ExistPosition(2);
for (int i=OrdersTotal()-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
fd=False;
if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
if (fep2) fd=OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
if (fep1) fd=OrderDelete(OrderTicket());
}
if (fd && UseSound) PlaySound(NameFileSound);
}
}
}
}
bool ExistPosition(int mn) {
bool Exist=False;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
Exist=True; break;
}
}
}
}
return(Exist);
}
Я конечно не очень подхожу на роль советчика, но задача вроде не сложная.
Обратите внимание на то что я не влезаю в сам Ваш код, там многое очень спорно, даже для меня(чайника), начиная с того что Ваша функция имеет тип void. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров. А у Вас в конце кода - return(Exist);
Объявите входящую переменную, пропишите её как параметр для Вашей функции и выходите из функции если во "входящих" 'этой переменной будет присвоено значение Ложь.
Priffekt: Добрый день, есть в советнике функция удаления отложенных ордеров при срабатывании другого ордера. Как прописать во внешние параметры что бы можно было эту функцию отключать. Заранее благодарю.
Найдите в тексте Вашего кода все False и True. Замените их на false и true. Этот язык чувствителен к регистру.
Привет разработчики,
Посмотреть любой тестер стратегий с пользовательской датой или любой опцией даты
Смотрите изображение:
Я хочу, чтобы я получил значения даты начала и конца в моей программе в функции OnInit ().
Как я могу получить это?
Оформите весь цикл в функцию, и возвращайте из неё номер бара если найден, либо WRONG_VALUE - если не найден.
Добрый день. Закончил кажется работать со вчерашней проблемной iCustom. Оформил всё в виде функции, для контроля применил "Comment" и "Print".
Смысл данного пробного советника в том, что-бы отлавливать сигналы в виде стрелок Вверх/Вниз от индикатора iCrossAD и превращать их в команду BUY или SELL, которая будет использоваться в будующей программе.
Опыта у меня маловато, потому прошу строго не судить, а вот аргументированная критика и советы, как было лучше сделать - приветствуются.
Собственно ради этого и писал пост. Файлы советника и индикатора прилагаю, код ниже.
Здравствуйте!
Перекодировал индикатор с МТ4 на МТ5. Индикатор хочу использовать, как доп. фильтр.
МТ5 только изучаю. Но, не могу найти ошибку. Отображение на МТ4 и МТ5 отличаются.
Просьба к спецам - помогите найти ошибку в файле *.mql5
Исходные коды прилагаю.
Заранее благодарен за помощь.
Добрый день, есть в советнике функция удаления отложенных ордеров при срабатывании другого ордера. Как прописать во внешние параметры что бы можно было эту функцию отключать. Заранее благодарю.
Это Ваш код, так лучше прикреплять.
Я конечно не очень подхожу на роль советчика, но задача вроде не сложная.
Обратите внимание на то что я не влезаю в сам Ваш код, там многое очень спорно, даже для меня(чайника), начиная с того что Ваша функция имеет тип void. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров. А у Вас в конце кода - return(Exist);
Объявите входящую переменную, пропишите её как параметр для Вашей функции и выходите из функции если во "входящих" 'этой переменной будет присвоено значение Ложь.
Добрый день, есть в советнике функция удаления отложенных ордеров при срабатывании другого ордера. Как прописать во внешние параметры что бы можно было эту функцию отключать. Заранее благодарю.
Найдите в тексте Вашего кода все False и True. Замените их на false и true. Этот язык чувствителен к регистру.
Найдите в тексте Вашего кода все False и True. Замените их на false и true. Этот язык чувствителен к регистру.
DeleteOppositeOrders(); void DeleteOppositeOrders() { bool fd, fep1, fep2; fep1=ExistPosition(1); fep2=ExistPosition(2); for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { fd=false; if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) { if (fep2) fd=OrderDelete(OrderTicket()); } if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) { if (fep1) fd=OrderDelete(OrderTicket()); } if (fd && UseSound) PlaySound(NameFileSound); } } } } bool ExistPosition(int mn) { bool Exist=false; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=true; break; } } } } return(Exist); }