Ваши вопросы по языку MQL4

matro3

Почетный гражданин
Код:
bool CheckDistanceOrders(string sy = "", int op = -1, int mn = -1, ushort pp = 0)
{
   int      i, k = OrdersTotal();
   if(sy == "0") sy = Symbol();
   for(i = 0; i < k; i ++)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if((OrderSymbol() == sy || sy == "") && (mn < 0 || OrderMagicNumber() == mn))
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
               if(op < 0 || OrderType() == op)
                  if(pp < MathAbs(OrderOpenPrice() - Close[0]) / _Point)
                     return(false);
   return(true);
}
 

Yura Vakulenko

Активный участник
по-моему здесь явная ошибка в коде..

int i, k = OrdersTotal();

for(i = 0; i < k; i ++)

переменным i,k присваивается в один момент одно и тоже значение.. как же тогда переменная i может быть меньше k ?
и мне же нужно проверять расстояние только в том случае, если будет получен сигнал на покупку-продажу.. SigPF==1 или SigPF==2 и нужно сравнивать с ценой, которая будет как раз когда будет получен сигнал..

В любом случае, спасибо огромное.. сейчас буду пробовать!

по-моему вернее написать так..

int k = OrdersTotal();
for(int i = 0; i < k; i ++)

и правильно ли использовать в сравнении OrderOpenPrice() - Close[0] именно Close[0] (та как если сигнал будет на покупку, он должен будет откртся по Ask, а если на продажу,)
 
Последнее редактирование:

matro3

Почетный гражданин
по-моему вернее написать так..

int k = OrdersTotal();
for(int i = 0; i < k; i ++)
Будет верно и так и так. В моем случае:
int i, k = OrdersTotal(); - это объявление переменных для дальнейшего их использования. Просто k сразу присваивается значение.
При этом i не равен k.
и мне же нужно проверять расстояние только в том случае, если будет получен сигнал на покупку-продажу.. SigPF==1 или SigPF==2
Используете функцию когда это нужно, не понял проблемы...
и правильно ли использовать в сравнении OrderOpenPrice() - Close[0] именно Close[0] (та как если сигнал будет на покупку, он должен будет откртся по Ask, а если на продажу,)
Это уже как Вам надо, так и пишите.
 

Yura Vakulenko

Активный участник
ок, понял вас Матрос! большое вам спасибо! буду сейчас пробовать!
 

vladradon

Программист
Это всего одна функция. Это не советник. просто все очень подробно расписал..

там нету ничего сложного в функции, просто не могу додуматся как написать.. может знатоки подскажут код..
Обратитесь ко мне в скайп - ник тот же. Помогу в режиме реального времени и Вы сами с моей помощью напишете код под Вашу стратегию. Там не обойтись одной функцией. Просто алгоритм мне нет смысла расписывать - он будет зависеть от других параметров, которые Вы используете.
 

Palesandr

Интересующийся
всем привет
вопрос такой
Код:
ObjectSetString(0,"Btn3",OBJPROP_TEXT,"Большой текст");

есть кнопка с настройкой, т.е. с текстом на кнопке. размер кнопки меньше надписи. как перенести слово "текст " на новую строку?
 

andrey555888

Прохожий
как вставить в советик функцию мартингейл

Подскажите пожалуйста поэтапно как вставить в советник функцию мартингейл
 

Cemen4yk1

Местный житель
Подскажите пожалуйста поэтапно как вставить в советник функцию мартингейл
слишком широкий вопрос, мартингейл бывает очень разный, ну если элементарный вариант:
если цена ушла против последнего/верхнего/нижненго ордера на какоето кол пунктов то открываем усредняющий ордер в туже сторону объёмом предыдущего ордера * на экспоненту
сопутствующие функции (находим цену откр нужного ордера, находим его объём)
 

andrey555888

Прохожий
Спасибо за ответ.Я имел в виду как технически вставить код мартина в любой советник например этот

//+------------------------------------------------------------------+
int LossCount = 0;
double LotsArray[]={0.1,0.2,0.4,0.8,1.6,3.2};

...

double Lots()
{
double Lot = Lots;
int total = OrdersHistoryTotal();
for (int i = 0; i < total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
{
if (OrderProfit() > 0)
{
Lot=LotsArray[0];
LossCount = 0;
}
else
{
Lot=LotsArray[LossCount+1];
LossCount++;
}
}
}
return(Lot);
}
//+------------------------------------------------------------------+
 

matro3

Почетный гражданин
Эта функция перебирает ордера в истории на предмет убыточного закрытия.
Если это так, то с каждым новым убыточным ордером Lot берется из массива выше, индекс элемента массива будет равен числу последних подряд убыточных сделок.
Если сделка в профит, счетчик сбрасывается.
Перед тем как выставить ордер - вызываете эту функцию, она вернет размер нужного Вам лота.
Все как бы просто. Только, мне кажется, раз у Вас возник такой вопрос, то Вы не готовы к тому чтоб ковырять чужой код.
 

ansol

Местный знаток
У меня возникла проблема.
Я пишу советника по типу "скальпер".
В тестере на котировках дукаскопи все ОК!
В реале, на новостях почему-то начинает открывать до хрена сделок с интервалом 2-3 пипса. В программе указано открывать на пол-ширины канала, т.е. пипсов 50-100.
Что нужно в программе прописать? Почему такая ерунда происходит?
 

matro3

Почетный гражданин
Сложно сказать. Может кусок кода поможет?
 

ansol

Местный знаток
Ну, ХЗ, конечно
Вот
PHP:
double iProfit = Point*fabs(OrderProfit() + OrderCommission() + OrderSwap())/(OrderLots()*dTickVal);
                  int iOrderTime = int(TimeCurrent() - OrderOpenTime());
                     if(OrderType() == OP_BUY && fOpenBuy1 && iProfit < dTFATR/(dKTF*dKTZ + dKTZ)) return(false);
И на SELL аналогично.
Т.е. по моему разумению близко ордера не должны открываться.
Мало того! Я написал индикатор, который показывает ширину канала в пунктах и я вижу, что этих пунктов много, никак не 3-5. (это пятизнак, если что)
 

matro3

Почетный гражданин
iProfit, так понимамю, профит в пунктах.
Не понятно что делает функция fabs, зачем она? Что-то нормализует, видимо.
Point, видимо, равен _Point. Если все так, то он там не нужен.
Я бы вычислял профит в пунктах так:
position.profit_current = OrderProfit() + OrderCommission() + OrderSwap();
position.profit_point = position.profit_current / (symb.tickvalue * position.volume) и тут нет _Point.
Но может я ошибаюсь и все нормально.

А может в (iProfit < dTFATR/(dKTF*dKTZ + dKTZ)) знак < надо поменять на >.
Мне выражение справа тоже ни о чем не говорит.

Попробуйте вывести значение переменных в Print(), это должно все прояснить.
 
Последнее редактирование:

ansol

Местный знаток
matro3
Понимаете, в чем дело - индикатор показывает geyrnjd 150, а ордера открываются с 2-3 пипса.
Тут дело такое - открываем в сторону тренда, а если что не так, то глушим убытки и открываемся в другую сторону.
В тестере все ОК, а в реале такая вот ерунда.
Ну, и конечно же, это безобразие на новостях.
Ну, дык! Скальпер же!
Просто, столько много сделок в неправильную сторону приносит убытки, ога!

И я не знаю, как это отследить. На новостях слишком все быстро летает :(
 

matro3

Почетный гражданин
Очень часто я думал что с моим кодом творится какая-то чертовщина, пока не находил свою ошибку. Робот есть робот. Раз он открывает, значит условие выполняется.

Давайте разберем этот код:
double iProfit = Point*fabs(OrderProfit() + OrderCommission() + OrderSwap())/(OrderLots()*dTickVal);
if(OrderType() == OP_BUY && fOpenBuy1 && iProfit < dTFATR/(dKTF*dKTZ + dKTZ)) return(false);
Полагаю он и отвечает за все это безобразие?..
Итак, наше условие: если IProfit (что вычисляет эта переменная?) меньше dTFATR/(dKTF*dKTZ + dKTZ)) (это ширина канала?), то сделке не бывать. Все верно?
Если последнее это ширина того самого канала, то он странно вычисляется. Может и нет, но выглядит так )....
Дайте пояснения к этим переменным.
 

ansol

Местный знаток
matro3
Спасибо, что заинтересовались моей проблемой.

dTFATR - это сам канал и есть. Как можно догадаться по названию, он вычисляется на основе индикатора ATR.
А эти всякие dKTF и dKTZ - небольшие коэффициенты, примерно, около единицы, хотя на новостях могут быть и больше единицы, но не более двух.
ВотЪ.
Я проверял.
Ну, в принципе, логично, что на новостях надо лупить больше сделок.

Главное - в тестере-то все рулит!
Я, блин, миллионер уже по тестеру!

Пользуюсь TickStory - на этом форуме есть тема. Этот тикстори тащит котировки дукаскопи и вот на них все классно работает, а в реале - хрен :(
 

ansol

Местный знаток
Я могу сюда выложить весь советник, но, боюсь, будут обсуждения не по теме - почему так криво и косо :)
 

matro3

Почетный гражданин
А в обычном тестере работает также?
Ну и на новостях безбожно растет спрэд. Вероятно в этом дело?
Я не уверен что могу Вам помочь )
Ищите, какое-то вычисление на новостях дает не тот результат что ожидается.
А значит спред виноват. Выставьте в тестере спрэд побольше и посмотрите, что будет.

Не увидел сообщение выше. Сейчас посмотрю.
 
Верх