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

Код:
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);
}
 
по-моему здесь явная ошибка в коде..

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, а если на продажу,)
 
Последнее редактирование:
по-моему вернее написать так..

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, а если на продажу,)
Это уже как Вам надо, так и пишите.
 
ок, понял вас Матрос! большое вам спасибо! буду сейчас пробовать!
 
Это всего одна функция. Это не советник. просто все очень подробно расписал..

там нету ничего сложного в функции, просто не могу додуматся как написать.. может знатоки подскажут код..
Обратитесь ко мне в скайп - ник тот же. Помогу в режиме реального времени и Вы сами с моей помощью напишете код под Вашу стратегию. Там не обойтись одной функцией. Просто алгоритм мне нет смысла расписывать - он будет зависеть от других параметров, которые Вы используете.
 
всем привет
вопрос такой
Код:
ObjectSetString(0,"Btn3",OBJPROP_TEXT,"Большой текст");

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

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

//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
 
Эта функция перебирает ордера в истории на предмет убыточного закрытия.
Если это так, то с каждым новым убыточным ордером Lot берется из массива выше, индекс элемента массива будет равен числу последних подряд убыточных сделок.
Если сделка в профит, счетчик сбрасывается.
Перед тем как выставить ордер - вызываете эту функцию, она вернет размер нужного Вам лота.
Все как бы просто. Только, мне кажется, раз у Вас возник такой вопрос, то Вы не готовы к тому чтоб ковырять чужой код.
 
У меня возникла проблема.
Я пишу советника по типу "скальпер".
В тестере на котировках дукаскопи все ОК!
В реале, на новостях почему-то начинает открывать до хрена сделок с интервалом 2-3 пипса. В программе указано открывать на пол-ширины канала, т.е. пипсов 50-100.
Что нужно в программе прописать? Почему такая ерунда происходит?
 
Ну, ХЗ, конечно
Вот
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. (это пятизнак, если что)
 
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(), это должно все прояснить.
 
Последнее редактирование:
matro3
Понимаете, в чем дело - индикатор показывает geyrnjd 150, а ордера открываются с 2-3 пипса.
Тут дело такое - открываем в сторону тренда, а если что не так, то глушим убытки и открываемся в другую сторону.
В тестере все ОК, а в реале такая вот ерунда.
Ну, и конечно же, это безобразие на новостях.
Ну, дык! Скальпер же!
Просто, столько много сделок в неправильную сторону приносит убытки, ога!

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

Давайте разберем этот код:
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)) (это ширина канала?), то сделке не бывать. Все верно?
Если последнее это ширина того самого канала, то он странно вычисляется. Может и нет, но выглядит так )....
Дайте пояснения к этим переменным.
 
matro3
Спасибо, что заинтересовались моей проблемой.

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

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

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

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

Посмотрели (406) Посмотреть

Отслеживают (499) Посмотреть

Назад
Верх