Можно конечно и в файл, но может лучше не менять магик?
Вопрос прогерам!
Сначала о сове:
Советник при определенных настройках, сам меняет свой Magic, в процессе работы.
Все работает как надо, но есть проблема!
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Можно конечно и в файл, но может лучше не менять магик?
Так как? Если можно! Магик НЕОБХОДИМО менять!
Необходимо? - для чего? Ведь магик изначально задумывался для того, чтобы советник отличал "свои" ордера от "чужих".
Так как? Если можно! Магик НЕОБХОДИМО менять!
Можно конечно и в файл, но может лучше не менять магик?
Решил и я попробовать освоить MQL4. xbms, "домашка" ещё проверяется? Если да, то прикладываю на проверку, пока первые три.
Правда эдитор немного ругается при компиляции, но я думаю это не критично и связано с изменениями вступившими после записи уроков. В дальнейшем поправится, а то пока точно не знаю как это устранить, ведь в видео про это не было.
Необходимо? - для чего? Ведь магик изначально задумывался для того, чтобы советник отличал "свои" ордера от "чужих".
Ну вот такая у меня стратегия! Советник обрабатывает ордер по определенному алгоритму, после чего открывает новый посредством смены магика, и тем самым доливает ордера!
Зачем писать кучу кода, когда можно обойтись простой сменой магика!
Изменено 26 июля, 2014 пользователем Enter
"простой сменой магика!" - это круто! Только я не пойму почему Вы пишите в этой теме? судя по тексту программировать Вы умеете.
Необходимо? - для чего? Ведь магик изначально задумывался для того, чтобы советник отличал "свои" ордера от "чужих".
Ну вот такая у меня стратегия! Советник обрабатывает ордер по определенному алгоритму, после чего открывает новый посредством смены магика, и тем самым доливает ордера!
Зачем писать кучу кода, когда можно обойтись простой сменой магика!
Только я не пойму почему Вы пишите в этой теме? судя по тексту программировать Вы умеете.
Подскажите! в какой теме мне могут помочь?
Здравствуйте!
Подскажите пожалуйста: как найти тип последнего закрытого ордера и если он закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. За ранние всех благодарю.
Привет ВСЕМ!!!
Вопрос прогерам!
Сначала о сове:
Советник при определенных настройках, сам меняет свой Magic, в процессе работы.
Все работает как надо, но есть проблема!
В начале новой недели или при каких то сбоях в связи, он возвращается к первоначальному Magic, который прописан в настройках.
Как сделать, например так что бы советник скидывал последние настройки во внешний файл, и подгружал при необходимости.
При сбоях и в начале новой недели?
Ну или при открытии терминала, в котором он же уже работал и выставил ордера! Например при отключении электроэнергии в сети!!!
Так если известно условие смены Magic'a - начало недели - то можно найти в коде, где происходит эта смена и там поправить. Это раз.
И при сбоях связи - Magic ордера измениться не может. Он или есть и передается совой, или его нет. А в процессе передачи по каналам связи - никто ничего не меняет. Это два.
Так если известно условие смены Magic'a - начало недели - то можно найти в коде, где происходит эта смена и там поправить. Это раз.
И при сбоях связи - Magic ордера измениться не может. Он или есть и передается совой, или его нет. А в процессе передачи по каналам связи - никто ничего не меняет. Это два.
Смена магика происходит только тогда когда ситуация на рынке совпадает с условиями настроек советника! Сова работает как часы, но на реале в связи со сбоями, перегрузками терминалов от ДЦ и тд... Сбивается и алгоритм совы!!!
Мне просто надо знать как это делается!!!! ПЕРЕДАЧА НАСТРОЕК СОВЕТНИКА ВО ВНЕШНИЙ ФАЙЛ И ОБРАТНО!!!
Новый магик хранится в памяти совы, а в настройках естественно начальный!!!
Что то типа set-файла, но чтобы передавался в сову на автомате, Иначе меняю при сбоях магик в ручную!!!
Изменено 27 июля, 2014 пользователем Enter
Можно воспользоваться этой функцией, возвращающей тип последней позиции:
Функция GetTypeLastClosePos().
Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента.
Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает тип последней закрытой позиции или -1 |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
int GetTypeLastClosePos(string sy="", int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), r=-1;
if (sy=="0") sy=Symbol();
for (i=0; i if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t t=OrderCloseTime();
r=OrderType();
}
}
}
}
}
return(r);
}
Чтобы узнать прибыльная ли позиция, можно в этот же код добавить проверку типа
if (OrderProfit()предварительно в глобальных переменных объявив переменную:
bool IsLossPos;
Изменено 27 июля, 2014 пользователем NTuner
Дык я его и писал, только найти нужно... Как найду отпишусь в личку.
0ll, у тебя случайно не завалялся исходник ind_Speed, а то вроде ты с ним работал. Поделись, если не затруднит.
Доброго времени суток, господа, помогите довести до ума советник. Суть проблемы такова:надо добавить функцию, чтобы после закрытия сделки в buy, например, следующая могла быть только в Sell и наоборот после сделки в Sell мог открываться только Buy . Как это сделать подскажите, текст советника ниже:
extern double Lots = 1;
extern int Slippage = 5;
extern string comment = "WT BOT";
extern int Magic = 123;
extern int startHour =10;
extern int endHour =18;
extern int tf_filtr = 60;
extern int takeprofit = 10;
extern int stoploss = 5;
extern string A2 = "--- Параметры индикатора ---";
extern int T3Period = 8;
extern int T3Price = PRICE_CLOSE;
extern double b = 0.618;
extern string TimeFrame = "current time frame";
extern int BarCount = 1500;
//----- Параметры индикаторов -----
extern string A = "--- СИГНАЛЫ ---";
extern bool ByBar = true; //Для побарового режима. При открытии свечи. Иначе - на каждом тике.
extern int SignalBar = 1; //Бар, на котором проверяется сигнал индикатора
double Sig1, Sig2, SL, TP;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
takeprofit *= 10;
stoploss *= 10;
Slippage *= 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
// индикатор в осциллографе
Sig1 = NormalizeDouble(iCustom(Symbol(), 0, "BB_MACD_v1.01", 0, 1), Digits); //лайм
Sig2 = NormalizeDouble(iCustom(Symbol(), 0, "BB_MACD_v1.01", 1, 1), Digits); //магнета
int Sig = Signal();
if((Sig == 1 && High[1] > High[2])&&(Sig1 != EMPTY_VALUE && Sig2 == EMPTY_VALUE) && (CountSell() > 0)) //лайм и есть ордера на продажу. то закрываем
{
for (int i = OrdersTotal ()-1; i >=0; i--)
{
if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderMagicNumber () == Magic && OrderType() == OP_SELL )
OrderClose (OrderTicket(), OrderLots (), Ask, Slippage, Black);
}
}
}
if((Sig == -1 && Low[1] 0))//магнета и есть ордера на покупку. то закрываем
{
for (i = OrdersTotal ()-1; i >=0; i--)
{
if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderMagicNumber () == Magic && OrderType() == OP_BUY )
OrderClose (OrderTicket(), OrderLots (), Bid, Slippage, Black);
}
}
}
if((Hour()>=startHour && Hour() High[2])&&(Sig1 != EMPTY_VALUE && Sig2 == EMPTY_VALUE) && (CountBuy() == 0))//зеленый и нет ордера на покупку. то открываем
{
SL = NormalizeDouble(Low[1]-stoploss*Point,Digits);
TP = NormalizeDouble(High[1]+takeprofit*Point,Digits);
OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, comment, Magic, 0, Blue);
}
if((Hour()>=startHour && Hour() {
SL = NormalizeDouble(High[1]+stoploss*Point,Digits);
TP = NormalizeDouble(Low[1]-takeprofit*Point,Digits);
OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, comment, Magic, 0, Red);
}
return(0);
}
//+------------------------------------------------------------------+
int CountSell ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic)
{
if (OrderType () == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic)
{
if (OrderType () == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//T3_08
int Signal()
{
double L1,L2,L1a,L2a;
L1 = iCustom(NULL,0,"T3_08_2Color",T3Period,T3Price,b ,TimeFrame,BarCount,0,SignalBar);
L2 = iCustom(NULL,0,"T3_08_2Color",T3Period,T3Price,b ,TimeFrame,BarCount,1,SignalBar);
L1a = iCustom(NULL,0,"T3_08_2Color",T3Period,T3Price,b ,TimeFrame,BarCount,0,SignalBar+1);
L2a = iCustom(NULL,0,"T3_08_2Color",T3Period,T3Price,b ,TimeFrame,BarCount,1,SignalBar+1);
if(L1 if(L1 > L2 && L1a > L2a ) return(-1);
return(0);
}
Чисто теоретически:
Когда сова запускается ведь приоритета нет? - и как-то работает.
После закрытия Бай ждем сигнала Селл - а его нет... надо-же отменить ожидание Селл в конце-концов - либо по индикатору либо по-времени (имхо).
Можете написать это ввиде кода?
Через стандартную функцию не считается, выдает всегда ноль:
double OnTester() {
double sharp=TesterStatistics(STAT_SHARPE_RATIO);
return(sharp);
}
OnTester returns 0.00000000000000
Добрый день, в советнике есть следующий код:
if (HourStartAUDUSD1 == TimeHour(TimeCurrent()) && MinuteStartAUDUSD1 == TimeMinute(TimeCurrent())&& ExistOrders("AUDUSD.f")==0 )
{
bidAUDUSD =MarketInfo("AUDUSD.f",MODE_BID);
ticket = OrderSendX("AUDUSD.f", OP_SELL, Lots, bidAUDUSD, slippage, 0, 0, comment, Magic, 0, Blue);
}
далее идет такой же код но для другой пары. время открытия ордеров одинаковое допустим 15.00.
на Alpari на 509 билде открывает оба ордера ( 4 одновременно тоже открывает) а на Roboforex 670 bild, открывает только один, и даже не первый по коду. AUDUSD.f это название валютной пары на ECN -Fix счете Roboforex.
Понятно что можно открытие ордеров сделать под общим временем, но переписывать не охота. кт оподскажет в чем мб причина данной проблемы и как с ней бороться, мб ли это из-за 670 bilda или из-за Roboforex? спасибо.
Приветствую всех
Столкнулся вот с какой проблемой я скопировал с другого рабочего советника функцию задача которой контроль количества открытых ордеров там от куда я ее скопировал она работает а у меня нет вот эта функция
int CountTrades()
{
int count = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count++;
}
}
return(count);
}
и вызов функции
if (CountTrades() == 0)
я попытался выяснить почему и вот что у меня получилось
если установить ордерсенд между фигурными скобками
if (CountTrades() == 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
}
функция работает как должна а именно если открытых ордеров нет то открывается ордер не важно какой я для примера взял на покупку и вот что получилось ордер открылся и закрылся согласно тейкпрофиту или стоплоссу и только потом открылся следующий ордер мне так и надо
если без фигурных скобак
if (CountTrades() == 0)
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
то тогда ордера открываются на каждом тике и не по одному а очень много я решил поставить скобки но когда я пишу условие дальше открываются сразу более 500 ордеров в промежутке 10 пунктов
есть какое то правило выставление фигурных скобак
Да, оно есть!!!!!!!!!!!
есть какое то правило выставление фигурных скобак
Фигурные скобки объединяют несколько операторов в один - составной. читать здесь
если фиг. скобок нет - после if(true) выполняется первый, а остальные на каждом тике.
Помогите пожалуйста, хотел вставить мартина но он почему то не работает
int start()
{
if (Hour()>=Hour_start && Hour() //инициализация параметров
{
int ticket = 0;
int old_order_type = OP_SELL;
//ищем среди всех открытых ордеров открытый советником ордер
RefreshRates();
for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
//проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
//если есть незакрытый ордер - выходим
return (0);
}
}
//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер
for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
old_order_type = OrderType();
if ( OrderProfit() return (OrderType());
}
}
//если раньше покупали, то теперь продаем
if ( old_order_type == OP_BUY )
{
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
//если раньше продавали, то теперь покупаем
if ( old_order_type == OP_SELL )
{
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
}
}
я сделал-бы проще:
в цикле поиска открытого ордера, если есть: запоминал тикет, тип и лот (перед выходом).
затем если открытых ордеров нет: по тикету смотрел профит и в зависимости от этого рассчитывал лот и открывал новый ордер.
А не работает Ваш код из-за этого:
if ( OrderProfit() return (OrderType());
У Вас первый ордер закрылся в убыток и после этого срабатывает return и не даёт открываться.
По идее надо было так:
old_order_type = OrderType();
bool UseMartin = OrderProfit() double oLot = OrderLots();
далее перед открытием:
lastlot = UseMartin? NormalizeDouble(oLot * Multiplier, 2) : NormalizeDouble(oLot, 2);
конечно можно написать и ещё лучше/оптимальней, но пойдёт и так.
Добавил, но все равно не работает.
Выходит ошибка OrderSend error 4051
invalid lots amount for OrderSend function
и не совсем понятно как читать UseMartin? NormalizeDouble(oLot * Multiplier, 2) : NormalizeDouble(oLot, 2);
если true, то выполнять действие?
int start()
{
if (Hour()>=Hour_start && Hour() //инициализация параметров
{
int ticket = 0;
int old_order_type = OP_SELL;
//ищем среди всех открытых ордеров открытый советником ордер
RefreshRates();
for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- )
{
//проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
//если есть незакрытый ордер - выходим
return (0);
}
}
//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер
for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- )
{
if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
old_order_type = OrderType();
//последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
bool UseMartin = OrderProfit() double oLot = OrderLots();
}
}
//если раньше покупали, то теперь продаем
if ( old_order_type == OP_BUY )
{
lastlot = UseMartin? NormalizeDouble(oLot * Multiplier, 2) : NormalizeDouble(oLot, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
//если раньше продавали, то теперь покупаем
if ( old_order_type == OP_SELL )
{
lastlot = UseMartin? NormalizeDouble(oLot * Multiplier, 2) : NormalizeDouble(oLot, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
return (0);
}
}
}
Изменено 2 августа, 2014 пользователем Ruslan982
Как обычно - "дьявол кроется в деталях", а именно: область видимости переменных, предварительная инициализация.
Добавил, но все равно не работает.
Читай здесь
и не совсем понятно как читать UseMartin? NormalizeDouble(oLot * Multiplier, 2) : NormalizeDouble(oLot, 2); если true, то выполнять действие?
С кодом своим сам будешь биться или мне поправить?
Здравствуйте. Я уже писал,что пытаюсь разобраться с написанием сов по внешнему индикатору. Получилось,что сов ,когда гистограмма одного цвета-то открывает только sell. Когда цвет меняется- то только buy. Решил вместо гистограммы подставить любой стрелочный индикатор. Сов индикатор видит,только открывает сразу две сделки и buy и sell одновременно и чихать он хотел на сигналы инд. Подскажите пожалуйста что делать!
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем