[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 82

 
nemo811:
Спасибо за помощь. Логику с установкой флага и функцией возвращения количества ордеров я понял. Но меня ещё интересует момент, когда ордер закрывается. Получается, что условие флага снова стремится поставить ордер, а функция возвращения говорит, что ордеров стало на 1 меньше и тоже инициализирует открытие позиции. Поправьте, если я что упустил.


из того кода, что вы предоставили, условие стоит тока в одном месте (BUY=true) и пока флаг не изменится повторного открытия не произойдёт..т.к. вызов функции на открытие позиции идёт из этого блока условия..А флаг в данном коде может измениться только после перезапуска советника, когда произойдёт инициализация переменной со значением true.

или я не понял вопроса:)

 
NameLess:


из того кода, что вы предоставили, условие стоит тока в одном месте (BUY=true) и пока флаг не изменится повторного открытия не произойдёт..т.к. вызов функции на открытие позиции идёт из этого блока условия..А флаг в данном коде может измениться только после перезапуска советника, когда произойдёт инициализация переменной со значением true.

или я не понял вопроса:)


Спасибо, всё поняли верно. Сейчас реализую.
 
NameLess:


Вот эта версия оказалась рабочей. Огромное спасибо Вам и IgorM:

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

Люди, НИЧЕГО не помогает! Ну никак не могу добиться чтоб получилось значение с 5 знаками после запятой. обыграл все варианты какие смог придумать и перевод строки в число и перевод подстроки в число, и вынимал цифры (пример выше) и тупо плюсовал поштучно, дальше 4-го знака просто не плюсует а начинает округлять до 4-го знака. даже всунул прибавление 6-го знака после запятой. всё равно лажа(

Может такое быть что Alert не отображает дальше 4-го знака переменные дабл?(строку полностью показывает) я уже не знаю что думать.. мистика какая то(

 

Народ, помогите пожалуйста: написал два связанных между собой советника(не торгуют, а только создают GlobalVarы) и думаю, что на их основе можно было б сделать индикатор эквиобъемных графиков похожий на обычный график цен в мт4, но никак не соображу каким образом все это дело нужно нарисовать в "indicator_separate_window". Или если кто уже юзает нечто подобное - поделитесь кодом:)

Файлы:
eqvol.rar  3 kb
 
NameLess:

Может такое быть что Alert не отображает дальше 4-го знака переменные дабл?(строку полностью показывает) я уже не знаю что думать.. мистика какая то(

да. он (как и Print) отображает стандарт 4 знака, если выводится только одно число.

для большей точности используйте DoubleToStr

 

РРРРРРРРРРРРРР. точно, Терминал в Alert не отображает дальше 4 знака.. перекинул дабл обратно в строку и вынул на экран посмотреть-всё корректно.

пол дня убил на этот тупняк. жесть, а всё было рабочее изначально(

 
NameLess:

Люди, НИЧЕГО не помогает! Ну никак не могу добиться чтоб получилось значение с 5 знаками после запятой. обыграл все варианты какие смог придумать и перевод строки в число и перевод подстроки в число, и вынимал цифры (пример выше) и тупо плюсовал поштучно, дальше 4-го знака просто не плюсует а начинает округлять до 4-го знака. даже всунул прибавление 6-го знака после запятой. всё равно лажа(

Может такое быть что Alert не отображает дальше 4-го знака переменные дабл?(строку полностью показывает) я уже не знаю что думать.. мистика какая то(

Ну как всегда всё опирается в эксперимент. Пишем скрипт:

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

Как видим, к скрипту подключена dll-ка. В ней всего одна функция, которая отбрасывает дробную часть числа. Длл-ку я приложил к данному посту. Теперь кидаем скрипт последовательно на 2 валютные пары. Я кинул на фунт и на еврояпонца. На фунте у меня 4 знака после запятой. На еврояпонце - два. Вот результат работы скрипта:

По фунту видим как последовательно перемещается запятая. И так же видно, что на последнем делении в дробной части остаётся 4 цифры. Можно сделать допущение, что поскольку Дигитс у меня = 4, то отсекается пятая цифра после запятой. Значит и на еврояпонце должно в результате остаться только 2 цифры после запятой, так как дигитс на нём = 2. Однако эксперимент показывает, что на нём тоже в результате получается 4 цифры после запятой. Значит наше предположение не верно и может быть происходит округление. Попробуем заменить конечную 4 на 7. Результат:

И что мы видим? Теперь результирующая пятёрка превращается в шестёрку. Следовательно происходит автоматическое округление.

Не знаю, как поведёт себя скрипт на пятизнаке, но работа на четырёх и двух-знаке меня не удовлетворила - терминал вмешался и сделал округление, о котором его ни кто не просил. Знач задавать вопросы нужно разработчикам. Либо - вариант 2 - снимаем показания индикатора, вгоняем их в строку, передаём строку в длл-ку, обрабатываем там данные как нам нужно, возвращаем из длл-ки торговый приказ.

Файлы:
experts.rar  42 kb
 

Инфа из справки (По алерту):

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

Вот и поди разберись зачем разработчики такое сделали...

 
drknn:


спасибо, изучил код, очень интересно. Всё, как я описал выше, оказлось проще: терминал просто в окошке не отображает дальше 4-й цифры. а все идеи были рабочими, просто по-разному решали вопрос преобразования:)

зы. В который раз убеждаюсь, что все проблемы решаются логическим путём, а тут ситуация была изначально нелогична, поэтому не там искали затык :)

Причина обращения: