Ты ошибаешься. Советник обращается к индикатору непосредственно командой кода. А если тестировать с визуализацией, то можно наложить индикатор на график для наглядности.может не по теме...я новичок...просто тут настоящие мозголомы!
скажите...как тестировать сову которая работает по индюку? ведь в тестер индюка не воткнуть, или я ошибаюсь?
extern string OpenTime = "10:00-10:05; 12:20-12:31; 13:40-13:55";
string OTA[];
string OTI[];
split(OTA, OpenTime, ";");
datetime tm0 = CurTime();
datetime tm1, tm2;
bool cond = false;
int cnt = ArraySize(OTA);
for (int i=0; i < cnt; i++) {
split(OTI, OTA[i], "-");
if (ArraySize(OTI) != 2) continue;
tm1 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[0]);
tm2 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[1]);
// Print (OTI[0], " *** " ,OTI[1]);
cond = cond || (tm1 <= tm0 && tm0 < tm2);
}
if (cond)
{
//Открываем позицию либо выполняем иные действия.
}
void split(string& arr[], string str, string sym)
{
ArrayResize(arr, 0);
string item;
int pos, size;
int len = StringLen(str);
for (int i=0; i < len;) {
pos = StringFind(str, sym, i);
if (pos == -1) pos = len;
item = StringSubstr(str, i, pos-i);
item = StringTrimLeft(item);
item = StringTrimRight(item);
size = ArraySize(arr);
ArrayResize(arr, size+1);
arr[size] = item;
i = pos+1;
}
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
int ticket = -1;
double OOP = High[1] + i_thresholdToUp * pt;
pr ("ND(OOP) = " + ND(OOP) + " ; Ask = " + Ask);
pr ("g_stopLevel = " + g_stopLevel);
if (ND(OOP)> (Ask + g_stopLevel))
ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(OOP), 3 * pt, 0, 0, NULL, i_magic, 0, CLR_NONE);
else pr ("Ордер послать не удалось " + GetLastError());
if (ticket > 0)
{
// lastBarTime = Time[0]; // На текущем баре все необходимые действия..
// .. успешно выполнены
return (true);
}
}
color coli3;
int R1;
--------
coli3=C'255,150,150';
Столкнулся с такой проблемой - требуется вместо чисел подставить переменные. Пробовал по разному, но ничего не выходит.
PHP:color coli3; int R1; -------- coli3=C'255,150,150';
- необходимо вместо чисел '150' подставить значение переменной.
Помогите, кто знает.
Свойство:
#property indicator_levelX 100
Хэ - от 1 до 8
Функция:
SetLevelValue(X, 100);
Хэ - от 0 до 31. Почему до 31 - хз
И это правильно - это 2 разных варианта. Свойство удобно для ручной установки значения, бо к нему есть доступ у пользователя. А функцию лучше юзать когда надо вычислять / менять значение в коде индикатора. При её использовании заданное пользователем вручную значение будет каждый раз затираться при инициализации - даже при переключении ТФПочему то работает и без строчки #property indicator_level1 100
if (iRSI(NULL,5,14,PRICE_CLOSE,1) > i_RSIToUpLimit)
if (iRSI(NULL,5,14,PRICE_CLOSE,0) < (i_RSIToUpLimit))
return (SIGNAL_BUY);
Ничего подобного, значение индикатора [0] пересчитывается на каждом тике.Как я узнал, что значение индикатора получаются только по цене открытия (хотя в документации этого не встречал ранее).
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
int t, total = OrdersTotal() - 1;
for (int i=total; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
{
if (OrderType() == OP_BUY) // Найден ордер типа OP_BUY
{
if (OrderProfit() < 0) // Если профит ордера ниже заданного значения,..
long = false; // .. покупка запрещена
}
if (OrderType() == OP_SELL) // Найден ордер типа OP_SELL
{
if (OrderProfit() < 0) // Если профит ордера ниже заданного значения,..
short = false; // .. продажа запрещена
}
t++;
}
}
return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
bool short = true,
long = true;
if (FindOrders(short, long) > 3)
return (SIGNAL_NO);
if (GetRSI(1) < i_RSIToUpLimit)
if (GetRSI(0) > i_RSIToUpLimit)
{
if (long == true)
return (SIGNAL_BUY);
}
if (GetRSI(1) > i_RSIToDnLimit)
if (GetRSI(0) < i_RSIToDnLimit)
{
if (short == true)
return (SIGNAL_SELL);
}
return (SIGNAL_NO);
}
2013.05.10 12:11:23 2012.05.21 00:35 Kevin_Martens_RSI EURUSD,M5: short = 1
2013.05.10 12:11:23 2012.05.21 00:35 Kevin_Martens_RSI EURUSD,M5: long = 0
2013.05.10 12:11:15 2012.05.21 00:30 Kevin_Martens_RSI EURUSD,M5: short = 1
2013.05.10 12:11:15 2012.05.21 00:30 Kevin_Martens_RSI EURUSD,M5: long = 0
2013.05.10 12:11:14 2012.05.21 00:25 Kevin_Martens_RSI EURUSD,M5: short = 1
2013.05.10 12:11:14 2012.05.21 00:25 Kevin_Martens_RSI EURUSD,M5: long = 0
2013.05.10 12:11:14 2012.05.21 00:20 Kevin_Martens_RSI EURUSD,M5: short = 1
2013.05.10 12:11:14 2012.05.21 00:20 Kevin_Martens_RSI EURUSD,M5: long = 0
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
int t, total = OrdersTotal() - 1;
double profitL, // Профит лонговой позиции
profitS; // Профит шортовой позиции
for (int i=total; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
{
if (OrderType() == OP_BUY) // Найден ордер типа OP_BUY
{
Print("if (OrderType() == OP_BUY)");
profitL = OrderProfit();
if (profitL < OrderProfit())
if (profitL < 0)
long = false;
}
else if (OrderType() == OP_SELL) // Найден ордер типа OP_SELL
{
Print("if (OrderType() == OP_SELL)");
profitS = OrderProfit();
if (profitS < OrderProfit())
if (profitS < 0)
long = false;
}
t++;
}
}
return (t);
}
int FindOrders(bool& long, bool& short)
if (FindOrders(short, long) > 3)
У вас порядок переменных в описании функции не соответствует порядку при вызове.
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
int t, total = OrdersTotal() - 1;
double profitL, // Профит лонговой позиции
profitS; // Профит шортовой позиции
for (int i=total; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
{
if (OrderType() == OP_BUY) // Найден ордер типа OP_BUY
{
if (profitL < OrderProfit())
{
profitL = OrderProfit();
pr("profitL =" + profitL); // Выводим профим через коммент на график
if (profitL < 0) // Если профит минусовой
long = false; // .. возводим флаг.. "покупки запрещены"
}
}
else if (OrderType() == OP_SELL) // Найден ордер типа OP_SELL
{
if (profitS < OrderProfit())
{
pr("profitS =" + profitS); // Выводим профим через коммент на график
profitS = OrderProfit();
if (profitS < 0) // Если профит минусовой..
short = false; // .. возводим флаг.. "продажи запрещены"
}
}
t++;
}
}
return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
bool short = true,
long = true;
if (FindOrders(long, short) > 15)
return (SIGNAL_NO);
Print("long = ", long);
Print("short = ", short);
if (GetRSI(1) < i_RSIToUpLimit)
if (GetRSI(0) > i_RSIToUpLimit)
{
if (long == true)
return (SIGNAL_BUY);
}
if (GetRSI(1) > i_RSIToDnLimit)
if (GetRSI(0) < i_RSIToDnLimit)
{
if (short == true)
return (SIGNAL_SELL);
}
return (SIGNAL_NO);
}