Oll можно и так, но я сделал так,как сделал.все работает. Я то же сначала не понял,потом сделал переменные все стало работать.Спасибо за подсказку, из головы вылетело что OP_BUY и OP_SELL это константы, и они не меняются !
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Благодарю Вас ув. Oll и Денис)))ошибки пропали)))
с ув.
Товарищи, подскажите начинающему )
В чужом советнике в самом верху прописал код для установки ММ. Ошибок нет. Но при тестировании при увеличении Депозита, позволяющего открывать больший лот, изменений не происходит. Лот открывает такой же, как и при начале тестов.
Подскажите, может нужно дописать какую то строчку, чтобы при открытии последующих сделок сов в первую очередь проверял это условие?
Или же советники с авто ММ вообще не тестируются?
double MM_Lot;
double Min_Lot;
int init() {
Min_Lot = MarketInfo(Symbol(), MODE_MINLOT);
if (MM == TRUE)
MM_Lot = MathFloor((AccountFreeMargin() - AccountCredit()) / Auto_MM) * Min_Lot;
else MM_Lot = BaseLotSize;
Rever27 функция инит отрабатывает 1 раз при запуске совы. если Вы хотите пересчитывать лот, то нужно расчёт лота делать непосредственно перед вызовом ОрдерСенд.
Поставил перед OrderSend - ничего не изменилось. Мм не меняется в зависимости от депозита.
воткнул в OrderSend - Мм заработал, но построение сетки у мартина слетело.
Возможно, авто мм не работает только в тесте, на реале будет иначе, буду разбираться.
Еще у меня есть такой вопрос, каверзный.
Что нужно прописать в индикаторе, чтобы ограничить количество одновременно торгуемых пар, скажем до 2-3. Как это представлено в Индикаторе от Советника FxHunter? Уж больше интересная функция
По поводу Индикатора от Советника FxHunter - там идёт расчёт просадки по эквити и если она больше порога, то совы на других парах не открывают новых сеток. (ну насколько я понял)
Rever27 тест и оптимизация должны работать без проблем. хоть с ММ хоть без.
По поводу Индикатора от Советника FxHunter - там идёт расчёт просадки по эквити и если она больше порога, то совы на других парах не открывают новых сеток. (ну насколько я понял)
0ll по эквити, это да. Но там есть еще одна полезная функция - ограничивать количество торгуемых пар в одно время. т.е. если из 5 пар у нас уже 2 в рынке, то по всем остальным ставиться блок. Вот как такого написать для своего индикатора, ума не приложу ))
В сове перед открытием сетки делаете перебор открытых ордеров по магику=111 и считаете разные символы (т.е. если текущего символа нет в строке, то symbCount++; и пишем символ в строку через ",", иначе пропускаем) по итогу подсчёта делаете вывод открывать или нет.
Понимаю, что пока мало в этом понимаю :d
Спасибо за советы, буду дальше учить "МатЧасть", по мере спрашивать :)
Зачем?
0ll В том то и проблема, что Маджики должны быть разные на всех парах.
Обычно советники фильтруют открытые ордера по (символу и магику). если одна сова стоит на нескольких парах, то совсем не обязательно менять магики.
Даже если Вы создадите индюк, о котором мечтаете, то всё равно придётся вносить изменения в советник для взаимодействия с индюком и это будет не проще, чем реализовать простой подход, о котором я писал выше.
Ну тут Вам решать что делать... будут конкретные вопросы - задавайте.
Обычно советники фильтруют открытые ордера по (символу и магику). если одна сова стоит на нескольких парах, то совсем не обязательно менять магики.
Даже если Вы создадите индюк, о котором мечтаете, то всё равно придётся вносить изменения в советник для взаимодействия с индюком и это будет не проще, чем реализовать простой подход, о котором я писал выше.
Ну тут Вам решать что делать... будут конкретные вопросы - задавайте.
На самом деле, я бы выбрал и простой подход, но моих знаний не хватит даже на его реализацию )
int CountTrades()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic)
if (OrderSymbol() == Symbol(EURUSD) || OrderSymbol() == Symbol(GBPRUSD) //и т.д.
count++
}
else
Ticket = OrderSend(....
}
return(count);
}
Понимаю, что как то так я смогу выделить пары, которые сейчас в торговле, но мысль, как видно, в код я перевести не могу )
И в интернете подобного кода не нашел
1. ну формально, функция будет называться CountSymbol
//=========================== Вызывающий код (разрешено 2 символа):
if (orderCount //если на данный момент по текущему символу ордеров нет
{ OrderSend(..... }
else return;
//=================================================
int CountSymbol()
{
int count = 0;
string sss = "";
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (!OrderMagicNumber() == Magic) continue;
if (StringFind(sss, OrderType(), 0) {
sss += OrderType() + ",";
count++;
}
}
/* else
Ticket = OrderSend(.... //Это не здесь нужно а в вызывающем коде
*/
}
return(count);
}
как-то так...
Изменено 16 февраля, 2015 пользователем 0ll
Rever27, я как понимаю вам надо открыть две сделки по разным парам.не знаю на сколько это правильно,но себе я сделал так.
[
extern int Magic = 123;
int Size_usd;
string Array_usd[] = {"EURUSD","GBPUSD"};
//--------------------------------------------------------++
int OnInit()
{
Size_usd=ArraySize(Array_usd);
}
//----------------------------------------------------------++
void OnTick()
{
if(CountTrades(Magic,OP_SELL) == 0)
Open_Orders();
//---------
}
//----------------------------------------------------------++
void Open_Orders()
{
int i,a;
for(i=Size_usd-1; i>=0; i --)
{
string sym_usd = Array_usd;
OrderSend(sym_usd,OP_SELL,Lots,MarketInfo(sym_usd,MODE_BID),Slippage,0,0,"",Magic,0,clrRed);
}
}
//----------------------------------------------------------++
int CountTrades(int mn, int Otype)
{
int count = 0;
for(int i=OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if((OrderMagicNumber() == mn) && (OrderType() == Otype))
count++;
}
}
}
return(count);
}
]
Изменено 16 февраля, 2015 пользователем denis77515
Полезная штука однако...
ага понятно, значит я не понял.интересная задача.
Спасибо всем за содействие :), я по специальности Инженер, но не унываю понять и Программирование )
А функция действительно полезная для защиты депозита от высокой просадки, если сов мультивалютный.
В FxHunter'е она реализована именно в индикаторе, но не думаю, что разработчики поделятся кодом )
0ll код завтра попробую проверить.
Только вопрос, я правильно понял, что в
string sss = ""; нужно прописать все пары, что используются в торговле?И
OrderSend( нужно 2 раза писать? При условии, что проверить работоспособность функции в тестере невозможно, то возможно ли создать alert для этого условия?
Данная ветка "Обучение языку..." - вот и обучайтесь...
Посидите со справкой в едиторе и разберите каждую строчку - это Вам нужно!
На Ваши вопросы могу ответить - Вы поняли не правильно.
Как можно реализовать стратегию Лабушер? С помощью массива?
??? не все думают синхронно с Вами...
Как можно реализовать стратегию Лабушер? С помощью массива?
что за стратегия?
Изначально это стратегия для казино.
Есть заданный ряд чисел, сумма ставки равна сумме крайних чисел. При проигрыше сумма ставки добавляется к числовому ряду, при выигрыше крайние числа вычеркиваются. Когда все числа вычеркнуты, прибыль будет равна сумме чисел начального ряда.
Думаю можно сделать это с помощью массива. Только надо будет определять крайние числа. Не знаю как это сделать, может с помощью цикла?
если да, то это последовательность Фибоначчи. Можно реализовать и без массива.
Опишите чётко, чтоб вопросов не возникало, можно и с примером расчёта.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем