Zeer goede informatie, CockeyedCowboy. Bedankt voor al je inspanningen! Zowel jij als rooicol zijn MT4-tovenaars!Originally Posted by ;
Zeer goede informatie, CockeyedCowboy. Bedankt voor al je inspanningen! Zowel jij als rooicol zijn MT4-tovenaars!Originally Posted by ;
Dat is interessant, daar heb ik nooit eerder over nagedacht, ik nam gewoon vaag aan dat het alles tegelijk deed, maar ik denk dat het zich een weg moet banen in een sequenti�le volgorde. Dit is nuttige informatie over GlobalVariableSet() en FileWrite(), als u andere grafieken hebt met GlobalVariableGet() en FileRead().Originally Posted by ;
zznbrm Bedankt voor de les vandaag, er zijn maar een paar mensen die ik naar hun code zal kijken, die van jou. .... Mijn begrip van hoe indiors in MT werken, is dat alle indiors draaien op wat MT de hoofdthread noemt, samen met het platform, en EA's en scripts draaien op de uitvoeringsthread. EA's ontvangen geen tikken per zeg maar maken een kopie van de gegevens uit de hoofdthread om op te draaien. dat is de reden waarom als je een script in een lus uitvoert en het gebruikt om te ruilen, je de functie refresshrate() moet gebruiken. of het script zal nooit nieuwe gegevens zien. Als een EA of Script een indior aanroept met bijvoorbeeld de iCustom-functie, laadt het eigenlijk een tweede kopie van de indior op de achterkant van de EA's, dus hoe meer indior het aanroept, hoe meer code er op de achterkant van de EA wordt geladen, hoe langzamer het ea wordt uitgevoerd, zijn de indor op de kaart niet toegankelijk voor een EA. allemaal, dus ik merk dat je twee kaarten kunt openen met hetzelfde symbool en allemaal dezelfde binnenkanten in elk venster. dat slechts ��n venster tegelijk wordt bijgewerkt. Het venster met de verlichte titelbalk wordt als eerste uitgevoerd en de andere worden ��n voor ��n in z-volgorde uitgevoerd. Ik heb twee vensters met code geladen om de uitvoering te vertragen, om dit te controleren. Keit
Ik ben blij dat je het hebt opgelost. Wat handel en programmeren betreft, leer ik elke dag iets nieuws.Originally Posted by ;
Ja, je hebt helemaal gelijk. Deze eenvoudige bewoners hebben misschien 1 milliseconde nodig om een ??????tik te verwerken. Mijn beste gok is dat er een andere interne MT4-verwerking is (die plaatsvindt voordat/nadat onze interne startfunctie wordt uitgevoerd) die de vertraging veroorzaakt bij het verwerken van nieuwe tikken. Het is moeilijk te speculeren zonder de interne MT4-code te zien. Inkomende tikken worden waarschijnlijk ontvangen via een soort berichtenwachtrij. Ik denk dat Indiors hun eigen thread hebben voor executie. Ben niet zeker van EA's. Voor Indiors/EA's is er waarschijnlijk een minimale hoeveelheid overhead verbonden aan het verwerken van elke tik (buiten onze startfunctie om). Deze overhead kan 10 ms of 100 ms zijn, afhankelijk van de complexiteit van de grafieken. Ik wed dat de mql4.com-website wat informatie heeft over de dingen die gebeuren voor elke inkomende tik. Hoe dan ook, ik wed dat het antwoord daar ergens is... maar de uitleg is waarschijnlijk erg technisch en omvat berichtenwachtrijen en single/multi-threaded processen en gaat mijn begrip van MT4 ver te boven.Originally Posted by ;
Ja, als je zijn indior toevoegt, zet de speciale functie int init() gadblVolume[0] op 0. Dit doet hij maar ��n keer. Dan voegt het er voor elke tik daarna 1 aan toe. Wanneer een nieuwe kaars wordt gemaakt, wordt gadblVolume[0] weer op 0 gezet (MT doet dit zoals je in een later bericht zegt), en dan begint het weer met 1 te tellen bij elke tik. Mooi; maar ik zie het nut niet in om te weten hoeveel tikken MT niet ontvangt zonder te begrijpen WAAROM het ze niet ontvangtOriginally Posted by ;
Bedankt, blij dat je ze leuk vindt!Originally Posted by ;
Dat is prima, maak je geen zorgen.Originally Posted by ;
Ja, ik heb er ook een, dacht alleen niet dat de meeste mensen er in ge�nteresseerd zouden zijn. Ik heb de mijne een beetje anders gedaan, hoewel ik nu de jouwe verkies omdat het veel eleganter is. Zo ziet de mijne eruit: Code ingevoegd #property copyright Gecodeerd door #property indior_chart_window int start() { static int TickCount; statische datum/tijd CandleOpenTime; if(CandleOpenTime!=Time#91;0#93 { CandleOpenTime=Time#91;0#93;; TickCount=0; } TickCount ; dubbel PercentageProcessed=(TickCount/Volume#91;0#93*100; Commentaar(DoubleToStr(Percentage verwerkt,1),%); terug(0); } Ik geloof echter niet dat de reden dat het aantal verwerkte tikken de reden is die u noemde (dat inkomende tikken tijdens de uitvoering van de speciale functie start() worden genegeerd). De tijd die nodig is om dit stuk code uit te voeren is minuscuul. Zelfs als je een lus maakt en de code 10.000 keer laat uitvoeren voor elke tik, en de tijd die het nodig heeft om dit te doen, duurt het ongeveer 200 milliseconden: Ingevoegde code #property copyright Gecodeerd door #property indior_chart_window int start() { int ms1=GetTickCount(); for(int i=0; ilt;10000; i ) { statisch int TickCount; statische datum/tijd CandleOpenTime; if(CandleOpenTime!=Time#91;0#93 { CandleOpenTime=Time#91;0#93;; TickCount=0; } TickCount ; dubbel PercentageProcessed=(TickCount/Volume#91;0#93*100; Commentaar(DoubleToStr(Percentage verwerkt,1),%); } int ms2=GetTickCount(); int Duur=ms2-ms1; Opmerking(Duur); terug(0); } Deze code hierboven kost mijn computer ongeveer 200 ms, dus 2/100 van een milliseconde per iteratie. Ik denk dat het te onwaarschijnlijk is dat er zoveel teken aankomen tijdens dit minuscule venster. Ik zou graag willen weten waarom het Volume[] != aantal tikken is.Originally Posted by ;
zznbrm Zie ik zei in mijn eerste bericht, je bent een betere codeur dat; Ik mis de boot volledig op deze. Het lijkt erop dat u de buffers niet hoeft te vervuilen om ze te vullen. MT doet dat voor ons. Bekijk al deze dialogen die men ervoor kan leren, ik heb afdrukverklaringen toegevoegd om te zien wanneer een nieuwe balk wordt geopend, MT zal de gegevens terugzetten zonder enig werk van onze kant. En hier was ik voor niets loops aan het schrijven. Keit
Ja, dat klopt.Originally Posted by ;
Nou, ik weet niet wat ik je moet vertellen... het werkt precies zoals het zou moeten voor mij. Voeg de indior toe aan een M1-diagram en ik weet zeker dat je zult zien dat het de tikken per maat telt zoals verwacht.Originally Posted by ;
Ok�, laten we het histogramgedeelte verwijderen. Het klopt nog steeds niet, de functieaanroep 'SetIndexEmptyValue()' stelt alleen de waarde van de buffer in als deze geen waarde heeft, en de init() functie wordt maar ��n keer uitgevoerd aan het begin van het programma. daarna wordt alleen de start()-functie uitgevoerd, totdat u deze stopt, wordt deinit() uitgevoerd bij het afsluiten, maar als u deze code uitvoert, is het enige dat de start()-functie doet, ��n toevoegen aan het nul-element van de buffer bij elke tik wordt dat element nooit leeggemaakt wanneer een nieuwe balk wordt geopend, dus wat u telt is elke tik die binnenkomt vanaf het moment dat het programma is gestart. en blijft toevoegen totdat het stopt. dus je krijgt geen echt aantal tikken per balk terwijl je tikken krijgt terwijl het programma aan staat, Keit
rooicol - Sorry voor de afleiding hier. Een of meer van deze berichten worden verwijderd als u dat wilt. CockeyedCowboy - Ok�... ik begrijp wat je nu zegt. Het histogram wordt niet gebruikt voor deze oefening...de buffergegevens zijn het belangrijkste stuk. Ik kopieerde gewoon een oud (heel eenvoudig) interieur dat een histogram tekende, maar schonk er helemaal geen aandacht aan. Ook geschiedenis doet er niet toe voor dit interieur. Aangezien er geen tikgeschiedenis is in MT4, zijn alle gegevens uit het verleden irrelevant. Nu, naar je belangrijkste vraag (denk ik) over het op nul zetten van de buffer voor een nieuwe balk. Deze regel in de init zorgt daarvoor: SetIndexEmptyValue( 0, 0.0 ); Zonder die regel wordt de bufferwaarde voor elke nieuwe balk ge�nitialiseerd naar wat de maximale integerwaarde lijkt te zijn. Maar met deze regel erin, wordt de bufferwaarde voor elke nieuwe balk op nul ge�nitialiseerd. Is dat de juiste manier om elke balk op 0 te initialiseren? Misschien niet, maar voor deze oefening lijkt het te werken. We hebben het hier niet over een productiegereed interieur. Dit is gewoon een basic interieur om even snel iets uit te testen. U kunt het histogramgedeelte ervan verwijderen en gewoon deze code uitvoeren: Code ingevoegd #property indior_chart_window #property indior_buffers 1 double gadblVolume#91;#93;; int init() { IndiorShortName( LiveVolume); IndiorDigits( 0 ); SetIndexBuffer( 0, gadblVolume); SetIndexLabel( 0, Live Volume); SetIndexStijl( 0, DRAW_NONE); SetIndexLegeWaarde( 0, 0.0 ); terug(0); } int start() { gadblVolume#91;0#93; = 1,0; terug(0); }Originally Posted by ;