표시기 A 의 매개변수를 변경할 때 표시기 B 가 판독값을 변경하도록 하려면 표시기(파일, 터미널의 전역 변수, 컴퓨터 RAM) 간에 정보를 교환하십시오. 표시기 A 는 초기화 중에 초기화된 매개변수를 전송하고 표시기 B 는 주기적으로 확인합니다. 표시기 A 의 매개변수 변경 가능성에 대해 변경 사항이 감지되면 표시기 B 도 새 매개변수로 다시 초기화해야 합니다(강제 init() 실행).
답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.
물어보기로 결정했습니다. 표시기를 작성합니다. 표시기에서 틱 시간 프레임(자율적으로 열리는 이 시간)에 틱을 처리합니다. 내 버퍼 배열에서는 모든 틱이 처리되지 않고 선택적으로 처리됩니다(60초마다 틱이 있다고 가정하지만 이것은 전혀 필요하지 않습니다). 대신에
int counted_bars=IndicatorCounted();
다음 구조를 이해합니다.
externint sec= 60 ; //объявляем количество секундint i; //будет индексом текущей "свечи" (тика)int i_prev; //будет индексом предыдущей "свечи" (тика), отстоящего от теущего на sec секунд назадdouble MyBuffer[]; //этот будет на чартеdouble MyTemp[]; //этот только для подсчётовint init(){
IndicatorBuffers( 2 );
SetIndexBuffer ( 0 ,MyBuffer)
SetIndexBuffer ( 1 ,MyTemp)
SetIndexDrawBegin( 0 , 14 );
i= Bars - 1 ;
while (Volume[i]-Volume[ Bars - 1 ]<sec) i--; //потому что в Volume[] на тиковом у нас время сервера точностью до секунды (а в Time[] - моделируемое для предоставления тиков на чарте)
i_prev= Bars - 1 ; //отошли от первого исторического тика на чарте на заданное количество секунд, запомнили его, запомнили первый, уходим в start()return ( 0 );
}
int start(){
double deltaHigh,deltaLow;
int counted_bars=IndicatorCounted(); //честно говоря, не уверен, т.к. считаем мы не все "свечи" (тики)if (counted_bars>=i) i= Bars -counted_bars- 1 ; //аналогичноwhile (i>= 0 ){ //цикл обработчика
deltaHigh=High[i]-High[i_prev]; //к примеру
deltaLow=Low[i_prev]-Low[i];
//и дальше код обработчика (формируем предварительный массив MyTemp[]). В конце цикла:
i_prev=i; //запоминаем теперь текущий индекс как индекс предыдущего тикаwhile (Volume[i_prev]-Volume[i]<sec){ //и уходим вперёд на заданное количество секунд
i--;
}
}
...
이제 질문입니다. 순수한 M1 버전에서 표준은 더
if (counted_bars> 0 ) counted_bars--;
int limit= Bars -counted_bars; //принтовал, при первом обращении limit=Bars-2, при последующих limit=2for (i= 0 ; i<=limit; i++){
MyBuffer[i]=iMAOnArray(MyTemp, 0 , 14 , 0 , MODE_EMA , i);
limit 및 counted_bars를 교체하는 방법은 무엇입니까? 내가 이해하기로는,
int counted_bars= ArraySize (MyTemp)-1; //сразу после цикла while
(60초 동안의 틱 수가 일정하지 않기 때문에, 즉 int counted_bars=IndicatorCounted()/_number_of_ticks_in_60_seconds_를 작성하는 것은 작동하지 않습니다).
아니면 내가 모든 것에 대해 잘못 알고 있습니까?
ps 가능한 질문에 앞서 답변드리겠습니다. sec!=60은 Forex에 적용되지 않고 sec=60은 의미가 없지만 Forex에서는 거래하지 않습니다.
MK07 : 답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.
실례합니다만, 차 있으신가요? 있다면 사치품이 아니라 필수품이라고 생각하십니까? 안 그러면 평생 그렇게 두지 않을 거지? 지금은 그런 시대입니다. 자동차를 소유하듯이 프로그래밍도 알아야 합니다. 일반적으로 나는 집단 농부이지만 적어도 어떻게 든 그렇게합니다. 예를 들어 자물쇠 제조공과 같은 마당의 작업에서 프로그래밍하는 것은 다르지 않습니다. 내 손으로 같은 작업 (나는 마을에 산다). 불가리아어, 수레 또는 MQL4는 나를 위한 도구일 뿐입니다. 어쩌면 도시의 경우 다르게 인식되는지도 모르겠습니다. 여기에 매뉴얼의 전역 변수가 있습니다. 표준 파일 기능은 여기 에 있습니다. 이들은 더 빠르지만 WinAPI를 통해 있습니다. 어제 대답하고 싶었지만 침묵했다.
#include <MASSIV.mqh> int start()
{
double Price=iOpen ( Symbol (), 0 , 0 );
double SL= NormalizeDouble (Price+ 3000 * Point , Digits );
double TP= NormalizeDouble (Price- 100 * Point , Digits );
double value = Bid ; //параметру value функции ArrayBsearch присваивается значение цены последнего тикаdouble ld_Delta = 0.0010 ;
int S = ArrayBsearch ( mass, value, WHOLE_ARRAY , 0 , MODE_ASCEND); //функция возвращает индекс значения цены макс. близкой к цене последнего тика int last_order_bar = 0 ;
int ot = OrdersTotal ();
...............................(остальной код опустил,но он не изменился)
사용자 지정 표시기를 다시 그리는 명령을 찾을 수 없습니다. 아시는 분 계시면 알려주세요. 미리 감사드립니다 =)
나는 이미 찾았습니다. 모두 감사합니다 =)
안녕하세요.
공식을 생각해내도록 도와주세요.
리필 단계 SD=100이 있습니다.
가격이 25이면 리필 수준은 UD=100이 됩니다.
가격이 102이면 리필 수준은 UD=200이 됩니다.
가격이 215이면 리필 레벨은 UD=300이 됩니다.
가격이 다시 135로 떨어졌고, 토핑 레벨은 UD=200이 됩니다.
그리고 이 순서는 정상입니다(이것이 터미널의 원리입니다).
표시기 A 의 매개변수를 변경할 때 표시기 B 가 판독값을 변경하도록 하려면 표시기(파일, 터미널의 전역 변수, 컴퓨터 RAM) 간에 정보를 교환하십시오. 표시기 A 는 초기화 중에 초기화된 매개변수를 전송하고 표시기 B 는 주기적으로 확인합니다. 표시기 A 의 매개변수 변경 가능성에 대해 변경 사항이 감지되면 표시기 B 도 새 매개변수로 다시 초기화해야 합니다(강제 init() 실행).
첫 번째 지표 코드는 A 입니다.
두 번째 코드는 지표 B 입니다.
마지막 질문을 해결했습니다, 새로운 질문이 있습니다
각 막대의 리필 수준을 다시 계산합니다.
마지막 막대의 레벨을 어떻게 기억합니까?
거래를 시작하는 데 사용
답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.
당신은 당신이 "장난치는"것을 당신을 위해 나에게 제안합니다. 죄송합니다, 관심이 없습니다.
프로그래밍을 배우고 있다면 이것은 흥미로운 작업입니다.
int counted_bars=IndicatorCounted();
다음 구조를 이해합니다.
이제 질문입니다. 순수한 M1 버전에서 표준은 더
limit 및 counted_bars를 교체하는 방법은 무엇입니까? 내가 이해하기로는,
(60초 동안의 틱 수가 일정하지 않기 때문에, 즉 int counted_bars=IndicatorCounted()/_number_of_ticks_in_60_seconds_를 작성하는 것은 작동하지 않습니다).
아니면 내가 모든 것에 대해 잘못 알고 있습니까?
ps 가능한 질문에 앞서 답변드리겠습니다. sec!=60은 Forex에 적용되지 않고 sec=60은 의미가 없지만 Forex에서는 거래하지 않습니다.
답변 감사합니다만 사용이 안되서요. 모든 것을 이해하지 못했고 프로그래밍에 약합니다. 내 지표의 코드에 필요한 변경을 할 수 있습니다.
좋은 오후에요 여러분!
배열을 사용하는 방법을 배우고 있습니다.
배열이 있습니다. 문자열로 초기화했습니다. 이중 질량 [3567]={ 0.85374 , 0.85694 , 0.85974 ,.... };
그리고 프로그램은 배열을 읽고 그것을 실행했습니다.
이제 동일한 배열을 하나의 열로 초기화했습니다.
더블 마시[3567]
{
질량[0] = 0.85374;
질량[1] = 0.85694;
질량[2] = 0.85974;
질량[3] = 0.86174;
질량[4] = 0.86474;
질량[5] = 0.86494;
질량[6] = 0.86504;
질량[7] = 0.86524;
}
컴파일러는 오류를 제공하지 않지만 경고를 제공하며 프로그램은 배열이나 코드를 전체적으로 실행하지 않습니다.
'{' - 전역 범위에 대한 표현식이 허용되지 않음 C:\Program Files\Alpari NZ MT4(2)\experts\include\MASSIV.mqh (4, 2)
배열은 이전과 같이( 문자열로 초기화되고 제대로 작동했을 때) 전역 수준에서 선언됩니다.
로그에는 2개의 항목만 있습니다.
2013.04.12 04:14:44 XXX 테스트 시작
2013.04.12 16:14:36 XXX EURUSD,H1: 성공적으로 로드됨
문제. 프로그램이 하나의 열로 초기화된 어레이를 읽지 않는 이유.
고맙습니다.