[아카이브!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 2. - 페이지 82

 
nemo811 :
도와 주셔서 감사합니다. 플래그를 설정하는 로직과 주문수를 반환하는 기능을 이해했습니다. 하지만 주문이 마감되는 순간에도 관심이 있습니다. 플래그 조건이 다시 주문을 하려고 하는 것으로 나타났고, 반환 함수는 주문이 1개 적었다고 말하고 위치를 여는 것도 초기화합니다. 내가 놓친 것이 있으면 수정하십시오.


당신이 제공한 코드에서 조건은 한 곳에서 현재 가치가 있으며(BUY=true) 플래그가 변경될 때까지 다시 열리지 않습니다.. 왜냐하면. 위치를 여는 함수 호출은 조건의 이 블록에서 옵니다. 그리고 이 코드의 플래그 는 변수가 true 값으로 초기화 될 때 EA를 다시 시작한 후에만 변경할 수 있습니다.

또는 질문을 이해하지 못했습니다 :)

 
NameLess :


당신이 제공한 코드에서 조건은 한 곳에서 현재 가치가 있으며(BUY=true) 플래그가 변경될 때까지 다시 열리지 않습니다.. 왜냐하면. 위치를 여는 함수 호출은 조건의 이 블록에서 옵니다. 그리고 이 코드의 플래그는 변수가 true 값으로 초기화될 때 EA를 다시 시작한 후에만 변경할 수 있습니다.

또는 질문을 이해하지 못했습니다 :)


감사합니다. 지금 시행하고 있습니다.
 
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번째 문자 이후에 이중변수를 표시하지 않는 것은 아닐까? (줄 전체가 표시됨) 더 이상 무슨 생각을 해야 할지 모르겠어.. 일종의 신비주의(

 

사람들, 도와주세요: 저는 두 명의 상호 연결된 Expert Advisors(거래는 하지 않고 GlobalVars만 생성)를 작성했으며, 이를 기반으로 하여 등량 차트의 지표를 일반 가격 차트와 유사하게 만드는 것이 가능할 것이라고 생각합니다. MT4, 하지만 이 모든 경우를 "indicator_separate_window"에 어떻게 그려야 하는지 알 수 없습니다. 또는 누군가가 이미 비슷한 것을 사용하고 있다면 코드를 공유하세요 :)

파일:
eqvol.rar  3 kb
 
NameLess :

Alert가 4번째 문자 이후에 이중변수를 표시하지 않는 것은 아닐까? (줄 전체가 표시됨) 더 이상 무슨 생각을 해야 할지 모르겠어.. 일종의 신비주의(

네. 하나의 숫자만 출력되는 경우 ( Print 와 같이) 표준 4자를 표시합니다.

더 정확하게 사용하려면 DoubleToStr을 사용하십시오.

 

ㅋㅋㅋㅋㅋㅋ 정확히는 경고 의 터미널은 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이 연결되어 있습니다. 숫자의 소수 부분을 버리는 함수는 하나만 있습니다. 이 게시물에 dll을 첨부했습니다. 이제 2개의 통화 쌍에 대해 스크립트를 순차적으로 던집니다. 나는 파운드와 유로-일본에 던졌다. 파운드에는 소수점 이하 4자리가 있습니다. 유로 - 일본어 - 2. 다음은 스크립트의 출력입니다.

파운드의 경우 쉼표가 어떻게 순차적으로 움직이는지 알 수 있습니다. 그리고 분수 부분의 마지막 나눗셈에는 4자리가 있다는 것도 분명합니다. Digits = 4이므로 소수점 이하 다섯 번째 자리가 잘린다고 가정할 수 있습니다. 이는 결과적으로 소수점 이하 2자리 숫자만 유로-일본어에 남아 있어야 한다는 것을 의미합니다. 그 이유는 소수점 이하 자릿수가 2이기 때문입니다. 그러나 실험에 따르면 소수점 이하 4자리도 나타납니다. 이것은 우리의 가정이 정확하지 않고 반올림이 발생할 수 있음을 의미합니다. 마지막 4를 7로 교체해 보겠습니다. 결과:

그리고 우리는 무엇을 봅니까? 이제 결과 5가 6으로 바뀝니다. 따라서 자동 반올림이 발생합니다.

스크립트가 5자리에서 어떻게 작동할지 모르겠지만 4자리와 2자리로 작업하는 것이 저를 만족시키지 못했습니다. 터미널이 개입하여 아무도 요구하지 않은 반올림을 수행했습니다. 즉, 개발자에게 질문을 해야 합니다. 또는 - 옵션 2 - 표시기 판독값을 가져와 문자열로 구동하고 문자열을 dll로 전송하고 필요에 따라 데이터를 처리하고 dll에서 거래 요청을 반환합니다.

파일:
experts.rar  42 kb
 

도움말 정보(경고별):

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

그러니 가서 개발자들이 왜 이런 짓을 했는지 알아내십시오 ...

 
drknn :


감사합니다. 코드를 공부했습니다. 매우 흥미롭습니다. 위에서 설명한 것처럼 모든 것이 더 간단해졌습니다. 터미널은 단순히 4번째 숫자를 넘어서는 창에 표시되지 않습니다. 모든 아이디어가 효과가 있었고 다른 방식으로 변형 문제를 해결했습니다. :)

추신 다시 한 번 나는 모든 문제가 논리적인 방식으로 해결되었다고 확신하지만 여기서는 상황이 처음에는 비논리적이어서 잘못된 위치에서 플러그를 찾고 있었습니다. :)

사유: