Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1094
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
С какой целью выделены слова "в этой стратегии"? Magic нужен, если на счете заключаются сделки вручную или еще другой советник запущен, чтобы эти ордер не трогать. По-моему так.
Нужно чтоб открывал всего для всех инструментов. Допустим MaxOpenOrders равен 1 должен открывать только один рыночный ордер. Это бот для бинарных опционов, там нет никаких отложенных ордеров. Правда, он работает сериями, если позиция закрывается в убытке, то открывается такая же только с увеличенным лотом и пока серия не закончится прибыльной сделкой не должны открываться никакие сделки по другим инструментам.
Ок, про бинарные опционы я упустил. Мне почему-то кажется, что если вручную цеплять на разные графики один и тот же советник, то всё равно будет считаться, что запущены разные советники. И для КАЖДОГО графика будет запускаться 1 опцион (ну когда работать будет как надо). Могу ошибаться, т.к. сам новичок. Я вопрос мультивалютности делал в самом советнике вот таким образом:
input string TradeSymbols = "EURUSD, GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF, GBPCAD"; // символы для торговли
string Symbols[50]; // 50 -максимально возможное количество символов
int SymbolCount;
//--------------------------------------------------
int OnInit()
{
if (IsTesting() || !ExtractSymbols())
{
SymbolCount = 1;
Symbols[0] = Symbol();
}
return(INIT_SUCCEEDED);
}
//--------------------------------------------------
bool ExtractSymbols()
{
ushort Comma = StringGetCharacter(",", 0);
SymbolCount = StringSplit(TradeSymbols, Comma, Symbols);
for (int i = 0; i < SymbolCount; i++)
{
StringToUpper(Symbols[i]);
Symbols[i] = StringTrimRight(Symbols[i]); // защита от случайных пробелов
Symbols[i] = StringTrimLeft(Symbols[i]);
}
if (SymbolCount > 0) return(true);
return(false);
}
//--------------------------------------------------
void OnTick()
{
for (int i = 0; i < SymbolCount; i++)
{
double LastAsk = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
double LastBid = SymbolInfoDouble(Symbols[i], SYMBOL_BID);
// и так далее...
}
}
Цеплять советник на любой график. Так точно MaxOpenOrders будет для всех графиков.
Ок, про бинарные опционы я упустил. Мне почему-то кажется, что если вручную цеплять на разные графики один и тот же советник, то всё равно будет считаться, что запущены разные советники. И для КАЖДОГО графика будет запускаться 1 опцион (ну когда работать будет как надо). Могу ошибаться, т.к. сам новичок. Я вопрос мультивалютности делал в самом советнике вот таким образом:
input string TradeSymbols = "EURUSD, GBPUSD, AUDUSD, NZDUSD, USDCAD, USDCHF, GBPCAD"; // символы для торговли
string Symbols[50]; // 50 -максимально возможное количество символов
int SymbolCount;
//--------------------------------------------------
int OnInit()
{
if (IsTesting() || !ExtractSymbols())
{
SymbolCount = 1;
Symbols[0] = Symbol();
}
return(INIT_SUCCEEDED);
}
//--------------------------------------------------
bool ExtractSymbols()
{
ushort Comma = StringGetCharacter(",", 0);
SymbolCount = StringSplit(TradeSymbols, Comma, Symbols);
for (int i = 0; i < SymbolCount; i++)
{
StringToUpper(Symbols[i]);
Symbols[i] = StringTrimRight(Symbols[i]); // защита от случайных пробелов
Symbols[i] = StringTrimLeft(Symbols[i]);
}
if (SymbolCount > 0) return(true);
return(false);
}
//--------------------------------------------------
void OnTick()
{
for (int i = 0; i < SymbolCount; i++)
{
double LastAsk = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
double LastBid = SymbolInfoDouble(Symbols[i], SYMBOL_BID);
// и так далее...
}
}
Цеплять советник на любой график. Так точно MaxOpenOrders будет для всех графиков.
а если следующая неделя пошла, а мне нужно все еще вести отчет от цены открытия бара вторника прошлой недели? т.е. мне нужно так, чтобы советник определил цену открытия бара во вторник и отталкивался от нее столько времени,сколько нужно, например - неделя, две, месяц и т.д.
Спасибо.
а если следующая неделя пошла, а мне нужно все еще вести отчет от цены открытия бара вторника прошлой недели? т.е. мне нужно так, чтобы советник определил цену открытия бара во вторник и отталкивался от нее столько времени,сколько нужно, например - неделя, две, месяц и т.д.
Спасибо.
Тогда задаёте конкретную дату и программа берёт цену открытия дня для той даты, это ещё проще даже.
Тогда задаёте конкретную дату и программа берёт цену открытия дня для той даты, это ещё проще даже.
можете с кодом помочь, я не догоняю то-то.
а может расчет цены открытия первого бара во вторник уложить в OnInit() и он рассчитает цену при запуске и запомнит ее пока советник не перезапустить? как думаете?
если бред пишу, прошу прощения, я только учусь)
можете с кодом помочь, я не догоняю то-то.
а может расчет цены открытия первого бара во вторник уложить в OnInit() и он рассчитает цену при запуске и запомнит ее пока советник не перезапустить? как думаете?
если бред пишу, прошу прощения, я только учусь)
Цена открытия первого бара дня = цена открытия дневного бара. Можно и в ините, если потом не возникнет нужды перерассчитывать это значение.
Код примерно такой:
Этот код на MQL5 написан?
for (int i=0; i<SymbolCount; i++)
{
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||
(TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) && MaxOpenOrders > OrdersTotal())
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = LastAsk;
if (Type == OP_SELL) Price = LastBid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal())
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = LastAsk;
if (Type == OP_SELL) Price = LastBid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
{
if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
}
}
}
Код в OnTick после слов и так далее... Написан на MQL4, а тебе нужен MQL5?
На каждый OrderSend условие MaxOpenOrders должен быть не больше OrdersTotal().
Код процедур (убрал проверку OrderSymbol()==Symbol() и ввел iClose()/iOpen() вместо Close/Open), правильность кода не проверял:
//+------------------------------------------------------------------+
int CountTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
bool SignalBuy(string Sym)
{
for (int i=1; i<=Wait; i++)
{
double C = iClose(Sym, PERIOD_M5, i); // Укажи здесь нужный таймфрейм
double O = iOpen(Sym, PERIOD_M5, i);
if (C > O) return(false);
}
if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
bool SignalSell(string Sym)
{
for (int i=1; i<=Wait; i++)
{
double C = iClose(Sym, PERIOD_M5, i); // Укажи здесь нужный таймфрейм
double O = iOpen(Sym, PERIOD_M5, i);
if (C < O) return(false);
}
if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0;
datetime opentime = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime();
opentime = OrderOpenTime();
}
}
}
}
return(opentime);
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0;
int type = -1;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic)
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
type = OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0;
double lots = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderOpenTime() > time)
{
time = OrderOpenTime();
lots = OrderLots();
}
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
double PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderClosePrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
double PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderOpenPrice();
}
}
}
}
return(price);
}
extern int Exp = 1;
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
Этот код у тебя работает??? Здесь дата должна быть, причем больше текущей на 10 минут (т.е. TimeCurrent() + 600 минимум).