Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1096
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте!
Как можно определит закрылась позиция по TP? Я не думаю что OrderClosePrice()==OrderTakeProfit() будет правильно использовать.
В комментарии ордера поискать [tp] если есть...
В комментарии ордера поискать [tp] если есть...
Здравствуйте Профи.
помогите исправить ошибку в индикаторе.....
индикатор работает.
сигнал срабатывает на 0-м баре.
но при поступлении других тиков на текущем баре опять срабатывает и дает новые сигналы.
а мне нужно, что при наступлении события Sell или Buy- этот сигнал в кружочка поставился на место текущей цены события, и больше на этом открытом баре никакие события не обрабатывались.
те новых сигналов и кружочков на этом баре не должно быть.
________________________
понимаю, что Вы скажете что это полная глупость, ложные сигналы, итд- но мне нужно именно так.
знаю что нужно создать флаг, метку итд.- но самому изучать язык- нет времени.
_________________________
буду очень благодарен, если в приложенный файл добавите такой флаг пометив добавленные строки цветом.....
Спасибо, и надеюсь кто-нибудь откликнется
Выдает пару ошибок, не получилось исправить. Что тут не так?
Помогите, пожалуйста, торговать на новостях. Очень нужен советник, у которого должны быть две основные функции.
Первая функция: выставление отложенных ордеров с заданным TP и SL, в заданное время на заданном уровне от цены.
Вторая функция: Держать отложки параллельно цене. Т.е, передвигать их вместе с ценой (руками так муторно это делать). И, в заданное время, во время выхода новости останавливать сие действие и ждать, когда цена заденет один из ордеров. Второй ордер после этого сразу же удаляется.
Ещё раз:
За 2 минуты до новости ставятся два противоположных stop-ордера на расстоянии 10 пунктов от цены, сразу же включается функция передвижения параллельно цены, 2 минуты передвигаться вместе с ценой, один ордер убегает от цены, второй догоняет цену. Во время выхода новости выключить функцию передвижения отложки и далее ждать пробоя одного из ордеров. Второй после пробоя первого сразу же удаляется.
Изменяемые в свойствах советника переменные (примерно, как я себе представляю, не знаю, какая на самом деле реализация):
TP - 600 (по умолчанию)
Trall - 300 (по умолчанию)
SL - 100 (по умолчанию)
Pips - 100 (расстояние от цены по умолчанию)
Slippage - 100 (проскальзывание в пунктах по умолчанию)
Lot - 0,1
Risk - 10 // процентов (ну, это не обязательно, потом попрошу, если что)
TimeNews1On - true (использовать ячейки ниже для ввода времени, false - советник не торгует их)
TimeNewsHour - часы (время выхода новости 1)
TimeNewsMin - минуты (время выхода новости 1)
TimeNews2On - false (по умолчанию)
TimeNewsHour - часы (время выхода новости 2)
TimeNewsMin - минуты (время выхода новости 2)
TimeNews3On - false
TimeNewsHour - часы (время выхода новости 3)
TimeNewsMin - минуты (время выхода новости 3)
TimeNews4On - false
TimeNewsHour - часы (время выхода новости 4)
TimeNewsMin - минуты (время выхода новости 4)
TimeNews5On - false
TimeNewsHour - часы (время выхода новости 5)
TimeNewsMin - минуты (время выхода новости 5)
Инста, пятизнак
Я всё это делаю вручную, муторно так, а теперь ещё и времени нет отрабатывать новости, хочу с утра или ночью поставить советник на пары, где в этот день будут новости, чтобы все они отработались.
--------------------------------------
Если знаете такие советники, встречали, то прошу поделиться
Заранее спасибо вам!
Вернемся обратно к твоему исходному коду. Попробуй вот так:
int OnInit()
{
if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
return(INIT_SUCCEEDED);
}
void OnDeInit()
{
GlobalVariableSet("AllowNewOrders",1);
}
void OnTick()
{
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
}
}
}
Не проверял, потому что не пойму каким образом несколько копий советника с общим ограничением в 1 ордер будут определять, на каком символе (после профитной серии) лучше начать торговлю?
Помогите, пожалуйста, торговать на новостях. Очень нужен советник, у которого должны быть две основные функции.
Первая функция: выставление отложенных ордеров с заданным TP и SL, в заданное время на заданном уровне от цены.
Вторая функция: Держать отложки параллельно цене. Т.е, передвигать их вместе с ценой (руками так муторно это делать). И, в заданное время, во время выхода новости останавливать сие действие и ждать, когда цена заденет один из ордеров. Второй ордер после этого сразу же удаляется.
Ещё раз:
За 2 минуты до новости ставятся два противоположных stop-ордера на расстоянии 10 пунктов от цены, сразу же включается функция передвижения параллельно цены, 2 минуты передвигаться вместе с ценой, один ордер убегает от цены, второй догоняет цену. Во время выхода новости выключить функцию передвижения отложки и далее ждать пробоя одного из ордеров. Второй после пробоя первого сразу же удаляется.
Если знаете такие советники, встречали, то прошу поделиться
Заранее спасибо вам!
Я тебе могу скину код для чтения данных новостей из файла, может пригодится. Раз в неделю заглядываешь в экономический календарь, заносишь данные в файл папка_с_терминалом\MQL4\Files\novosti.txt тех новостей, на которые стоит обратить внимание, советник можешь включать даже непосредственно перед новостью (можно таким советником начало, например, американской сессии отслеживать - вдруг сильное движение будет). Код в части торговли у меня так и не доработан, поскольку пару раз на новостях меня серьезно "кинули" :)) Последняя версия ставит аж шесть ордеров (3 buy stop + 3 sell stop) на разном расстоянии с разным тейкпрофитом... В общем новостной код рабочий, а торговый надо дорабатывать.
#property strict
input string NewsFilename = "novosti.txt"; // Имя текстового файла с новостями
input int MinutesBefore = 5; // За сколько минут до выхода новости ставить ордера
input int MinutesAfter1 = 15; // Через сколько минут после выхода новости удалить ордера 1 группы
input int MinutesAfter2 = 30; // Через сколько минут после выхода новости удалить ордера 2 группы
input int MinutesAfter3 = 30; // Через сколько минут после выхода новости удалить ордера 3 группы
input int PriceIndent1 = 15; // Отступ от цены в пунктах
input int PriceIndent2 = 5; // Отступ от предыдущего тейкпрофита в пунктах
input int TakeProfit1 = 40; // Размер тейкпрофита для 1 группы в пунктах
input int TakeProfit2 = 60; // Размер тейкпрофита для 2 группы в пунктах
input int TakeProfit3 = 100; // Размер тейкпрофита для 3 группы в пунктах
input int StopLoss = 20; // Размер стоплосса для всех ордеров в пунктах
input double Multiplier1 = 1.0; // Коэффициент к лоту ордеров 2 группы
input double Multiplier2 = 2.0; // Коэффициент к лоту ордеров 3 группы
input int MaximalRisk = 10; // Максимальный риск в процентах
//====================================================================================================
datetime Times[200], LastTime;
string Symbols[200];
bool NewsPassed[200];
int NewsCount;
//====================================================================================================
int OnInit()
{
// Загрузка свежих новостей
if (!LoadNews()) return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
//====================================================================================================
void OnTick()
{
if (!IsTradeAllowed()) return;
datetime TestTime = iTime(Symbol(), PERIOD_H1, 0);
// Обновление новостей в начале каждого дня
if (TimeDay(TestTime) != TimeDay(LastTime))
{
LastTime = TestTime;
if (!LoadNews())
{
Alert("Ошибка обновления новостей!");
return;
}
}
//-------------------------------------------------------------------------------------------------
for (int i = 0; i < NewsCount; i++)
{
// До выхода новости ставить ордера на пробой
if (Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])
{
PrintFormat("Текущее время - %s, пора ставить ордера по валюте - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i]);
SetupOrders(Symbols[i]);
NewsPassed[i] = true;
}
}
//-------------------------------------------------------------------------------------------------
}
//====================================================================================================
bool LoadNews()
{
int Count, Tick = 0;
string Str, Data[40];
ResetLastError();
if (!FileIsExist(NewsFilename, 0))
{
PrintFormat("Файла новостей %s не существует.", NewsFilename);
Print("Файл должен находится в папке \\MQL4\\Files, при тестировании - в папке \\Tester\\Files.");
return(false);
}
int Handle = FileOpen(NewsFilename, FILE_READ|FILE_SHARE_READ|FILE_TXT);
if (Handle != INVALID_HANDLE)
{
while (!FileIsEnding(Handle))
{
Str = FileReadString(Handle);
Count = StringSplit(Str, StringGetChar(" ", 0), Data);
for (int i = 1; i < Count; i = i + 2)
{
Times[Tick] = StringToTime(Data[0] + " " + Data[i]);
Symbols[Tick] = Data[i + 1];
Tick++;
}
}
FileClose(Handle);
NewsCount = Tick;
for (int i = 0; i < NewsCount; i++)
{
if (Times[i] > TimeCurrent()) NewsPassed[i] = false;
else NewsPassed[i] = false;
}
PrintFormat("Количество новостей загружено - %i.", NewsCount);
return(true);
}
PrintFormat("Не удается открыть файл %s. Код ошибки %d.", NewsFilename, GetLastError());
return(false);
}
//====================================================================================================
void SetupOrders(string Sym)
{
int Ticket, Dig, Count;
double Price, TP, SL, Lot;
datetime KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
string SymList[7];
//-------------------------------------------------------------------------------------------------
if (Sym == "AUD")
{
SymList[0] = "AUDCAD"; SymList[1] = "AUDCHF"; SymList[2] = "AUDJPY"; SymList[3] = "AUDNZD";
SymList[4] = "AUDUSD"; SymList[5] = "EURAUD"; SymList[6] = "GBPAUD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "CAD")
{
SymList[0] = "AUDCAD"; SymList[1] = "CADCHF"; SymList[2] = "CADJPY"; SymList[3] = "EURCAD";
SymList[4] = "GBPCAD"; SymList[5] = "NZDCAD"; SymList[6] = "USDCAD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "CHF")
{
SymList[0] = "AUDCHF"; SymList[1] = "CADCHF"; SymList[2] = "EURCHF"; SymList[3] = "GBPCHF";
SymList[4] = "CHFJPY"; SymList[5] = "NZDCHF"; SymList[6] = "USDCHF";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "EUR")
{
SymList[0] = "EURAUD"; SymList[1] = "EURCAD"; SymList[2] = "EURCHF"; SymList[3] = "EURGBP";
SymList[4] = "EURJPY"; SymList[5] = "EURNZD"; SymList[6] = "EURUSD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "GBP")
{
SymList[0] = "EURGBP"; SymList[1] = "GBPAUD"; SymList[2] = "GBPCAD"; SymList[3] = "GBPCHF";
SymList[4] = "GBPJPY"; SymList[5] = "GBPNZD"; SymList[6] = "GBPUSD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "JPY")
{
SymList[0] = "AUDJPY"; SymList[1] = "CADJPY"; SymList[2] = "CHFJPY"; SymList[3] = "EURJPY";
SymList[4] = "GBPJPY"; SymList[5] = "NZDJPY"; SymList[6] = "USDJPY";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "NZD")
{
SymList[0] = "AUDNZD"; SymList[1] = "EURNZD"; SymList[2] = "GBPNZD"; SymList[3] = "NZDCAD";
SymList[4] = "NZDCHF"; SymList[5] = "NZDJPY"; SymList[6] = "NZDUSD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "USD")
{
SymList[0] = "AUSUSD"; SymList[1] = "EURUSD"; SymList[2] = "GBPUSD"; SymList[3] = "NZDUSD";
SymList[4] = "USDCAD"; SymList[5] = "USDCHF"; SymList[6] = "USDJPY";
}
//-------------------------------------------------------------------------------------------------
for (int i = 0; i < 7; i++)
{
Count = 0;
Dig = int(MarketInfo(SymList[i], MODE_DIGITS));
Lot = NormalizeDouble(0.01, 2);
// Покупка
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
Price = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price + TakeProfit1 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);
if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot);
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;
Price = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);
if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1);
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;
Price = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);
if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier2);
// Продажа
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
Price = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price - TakeProfit1 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot);
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;
Price = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price - TakeProfit2 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1);
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;
Price = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);
TP = NormalizeDouble(Price - TakeProfit3 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);
Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
PrintFormat("По символу %s выставлено %i ордеров.", SymList[i], Count);0 }
}
Файл новостей выглядит так:
15.09.2016 01:45 NZD 04:30 AUD 10:30 CHF 14:00 GBP 15:30 USD
16.09.2016 15:30 USD 17:00 USD
и так далее...
Вернемся обратно к твоему исходному коду. Попробуй вот так:
int OnInit()
{
if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
return(INIT_SUCCEEDED);
}
void OnDeInit()
{
GlobalVariableSet("AllowNewOrders",1);
}
void OnTick()
{
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
}
}
}
Не проверял, потому что не пойму каким образом несколько копий советника с общим ограничением в 1 ордер будут определять, на каком символе (после профитной серии) лучше начать торговлю?
Александр, бот должен на каждом символе ждать установленное в настройках количество свечей подряд в одном направлении после чего начинать серию, то есть на каком символе это условие сработает первым по тому символу и открывать первую сделку. При этом нужно запретить открывать серии по другим символам пока первая серия не завершится прибылью.
Тот последний код, который ты дал это уже шаг в перед - он не открывает вообще ни одной сделки (значит запрет действует). Пока не понял почему вообще ни одной. В приложении скрин журнала.
Может уже пора научится как вставлять код?!