Sormak! - sayfa 34

 
AnasFX:
Tamam işe yaradı, ama şimdi sorun performans. Tüm geçmişi kontrol etmek zaman alır. Bir buçuk yıl geriye dönük test yaptım ve yavaş olduğunu fark ettim. Bunun nedeni, geçmişteki tüm siparişleri kontrol etmem ve onların kapanış fiyatını ve kapanış zamanını karşılaştırmamdır. Öyleyse, geçmiş aramasını yalnızca son siparişleri aramasını sağlayacak şekilde sınırlamanın bir yolu var mı? Performansı herhangi bir şekilde artırabilir miyim?

deneyebilirsin

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

ama bunun için emin değilim, bence tüm tarihteki son siparişi alacak

şerefe

 

selam millet...

Birisi bana yardım edebilir mi..

EA oluşturmak için bazı göstergelerim var ....

 
phoenix:
deneyebilirsin

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

ama bunun için emin değilim, bence tüm tarihteki son siparişi alacak

şerefe

benim hatamdan düzenlendi.. olması gerekiyor

OrderSelect( HistoryTotal()-1 ,SELECT_BY_POS,MODE_HISTORY);

 

Çift gönderi için özür dilerim ama gerçekten yardıma ihtiyacım var...

Burada çaresizim. Dizimi çalıştırmak için bütün gece uğraştım ama hiçbir şey olmuyor. Gerçekten kendi kendime yeterli olmaya ve öğrenmeye çalıştım ama hala gitmem gereken yere ulaşamıyorum. Biri bana merhamet etsin ve bana biraz yardım etsin... LÜTFEN!!!!!

Bir ızgara komut dosyası çalıştırıyorum ancak kaç lot çalıştırdığımı Symbol tarafından izlemek istiyorum. Toplam pozisyonumun ne olduğunu lot boyutuna göre ekleyebilmek istiyorum. Diyelim ki 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, 0.90 lota eşdeğer olduğumu bilmek istiyorum. Ayrıca minimum ve maksimum parti büyüklüklerini de bilmek istiyorum....0.10 ve 0.30

ArrayResize(OrderArray, i);

ArrayInitialize(OrderArray,0);

cnt = 0;

for (i = 0; i < OrdersTotal(); i++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

////// I can't get anything to work!!!!!!!

BuyLots += OrderArray[cnt][LOTS];

////// This returns Zero when I place BuyLots in my Comments

////// This returns error messages

MaxBuyLots =ArrayMaximum(OrderArray[LOTS],WHOLE_ARRAY,0);

}

 
deeforex:
Çift gönderi için özür dilerim ama gerçekten yardıma ihtiyacım var...

Burada çaresizim. Dizimi çalıştırmak için bütün gece uğraştım ama hiçbir şey olmuyor. Gerçekten kendi kendime yeterli olmaya ve öğrenmeye çalıştım ama hala gitmem gereken yere ulaşamıyorum. Biri bana merhamet etsin ve bana biraz yardım etsin... LÜTFEN!!!!!

Bir ızgara komut dosyası çalıştırıyorum ancak kaç lot çalıştırdığımı Symbol tarafından izlemek istiyorum. Toplam pozisyonumun ne olduğunu lot boyutuna göre ekleyebilmek istiyorum. Diyelim ki 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, 0.90 lota eşdeğer olduğumu bilmek istiyorum. Ayrıca minimum ve maksimum parti büyüklüklerini de bilmek istiyorum....0.10 ve 0.30

Sorun, arrayresize() öğesinin ikinci öğeyi değil, yalnızca ilk öğeyi yeniden boyutlandırmasıdır. Açıkçası, LOTS,PROFIT ve OPEN makrolarınız sırasıyla 0,1,2 olmalıdır. Ayrıca for döngüsündeki count nesnesi (i)'dir, ancak blok kodu (cnt) ile ilgilidir. bunu deneyin ve bunun işe yarayıp yaramadığını görün.

double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

MaxBuyLots =ArrayMaximum(OrderArray);

}

 

Teşekkürler Nicholishen,

Biraz daha yaklaşıyorum. BuyLots istediğimi iade ediyor ama ArrayMaximum bana tam olarak anlayamadığım garip bir sayı veriyor. En büyük LotSize'ı döndürmüyor.

Yardımı gerçekten takdir ediyorum.

dee

 
deeforex:
Teşekkürler Nicholishen,

Biraz daha yaklaşıyorum. BuyLots istediğimi iade ediyor ama ArrayMaximum bana tam olarak anlayamadığım garip bir sayı veriyor. En büyük LotSize'ı döndürmüyor.

Yardımı gerçekten takdir ediyorum.

dee

diziyi farklı dizilere bölmeniz veya maksimum diziyi çıkarmak için bir döngü yazmanız gerekir. gibi:

double OrderArray...[];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArrayProfit[cnt] = OrderProfit() + OrderSwap();

OrderArrayOpen[cnt] = OrderOpenPrice();

OrderArrayLots[cnt] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArrayLots[cnt];

MaxBuyLots =ArrayMaximum(OrderArrayLots);

}

[/CODE]

or

[CODE]double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

}

double MBL;

for(int i=0;i<OrdersTotal();i++){

if(OrderArrayLots[LOTS]>MBL)MBL=OrderArrayLots[LOTS];

}

MaxBuyLots =MBL;

 

Dizileri kullanarak, takip eden verileri karşılık gelen işlemin bilet numarasıyla eşleştirerek aynı para biriminde birden fazla işlemde sıkı takip eden durakları izleyen bir fonksiyona başka bir örnek. Belki bu da size bazı fikirler vermenize yardımcı olur.

int tsTicket[21];

double tsPrice[21];

bool tsok[21];

int tkt3[20];

int SuperClose(){// superclose by nicholishen

int cnp=ordercnt();

for(int i=0;i<cnp;i++){

if(OrderMatch(i)){

if(0==0){//Pulls in order that meets the criteria for processing

int num=0;int pos=0;

for(int b=0;b<21;b++){// this (loopB) compares the ticket# of the selected order against the number stored in the ticket array

if(tsTicket==OrderTicket() ){

num++; pos=b;// if ticket numbers match, pos is the position in the array where the trailing data is stored

break;

}

}

if(num==0){ // if the loopB did not find a matching ticket number it is time to initialize the data

for(int j=0;j<21;j++){

if(tsTicket[j]==0){// this is looking for the earliest instance within the array to store the data

pos=j;

break;

}

}

tsTicket[pos]=OrderTicket();// setting the ticket number

tsok[pos]=false;// this is to determine when trailing kicks in

// Print("(",pos,") New ticket initialized = ",tsTicket[pos]);

}

if (OrderType()==OP_SELL) {

if (!tsok[pos] && (OrderOpenPrice()-Ask>=TSactivation*Point || TSactivation==0 ) ) {// if the trailing factor is false, but it has hit the activation point continue

tsPrice[pos]=Ask+TrailPips*Point;// this is the new trailinf stop price

tsok[pos]=true;// it's ok to proceed with trailing stop

if(TrailPips>8){// if this distance from the current price to the new stop, then modify the order.

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());//modifies order

}

}

if (tsok[pos] && Ask+TrailPips*Point < tsPrice[pos] ){//if the position is gaining in profit

tsPrice[pos]=Ask+TrailPips*Point;

if(TrailPips>8){

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Ask >= tsPrice[pos] ){// if the postion hits the stop price

if(CloseOrder(Ask)==STOP)return(STOP);

Print("Short Order ",tsTicket[pos]," Closed from TS");

}

}

else if (OrderType()==OP_BUY) {// reverse of SELL

if(!tsok[pos] && (Bid-OrderOpenPrice() >= TSactivation*Point || TSactivation==0 ) ) {

tsPrice[pos]=Bid-TrailPips*Point;

tsok[pos]=true;

if(TrailPips>8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid-TrailPips*Point > tsPrice[pos] ){

tsPrice[pos]=Bid-TrailPips*Point;

if(TrailPips > 8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid <= tsPrice[pos] ){

if(CloseOrder(Bid)==STOP)return(STOP);

Print("Long Order ",tsTicket[pos]," Closed from TS");

}

}

}

}

if(RefreshRates())return(STOP);

}

for(i=0;i<21;i++){// this searches the array for ticket numbers that are now obsolete due to an order that has closed

if(tsTicket>0){

bool found=false;

for(b=0;b<OrdersTotal();b++){

OrderSelect(b,SELECT_BY_POS);

if(tsTicket==OrderTicket()){

found=true;

break;

}

}

if(!found){// if there are matching ticket numbers in the trade pool and the array then nothing happens

tsTicket=0;tsPrice=0;tsok=false;// if there is an obolete ticket the the data is reset. And the next new ticket data can occupy this space

// Print("Array pos ",i," Cleaned");

}

}

}

return(0);

}

int ordercnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

tkt3[c]=OrderTicket();

c++;

}

}

}

return(c);

}

//+------------------------------------------------------------------+

int curcnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderSymbol()==Symbol()){

c++;

return(c);

}

}

}

return(c);

}

//+------------------------------------------------------------------+

bool OrderMatch(int i){

if(OrderSelect(tkt3,SELECT_BY_TICKET)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

return(true);

}

}

return(false);

}
 

Tekrar teşekkürler!

3. satırı son satırdan buna değiştirdim

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

ve işe aldı. Yatma saatim çoktan geçti. Yarın uyandığımda kodunun mantığını inceleyeceğim. Ama inatçı olduğum için lanet olası ArrayMaximum işlevini nasıl kullanacağımı bulacağım !! Ayrıca eski yöntemlerimin ne kadar yanlış olduğunu görmek için indeksleme hakkında daha fazla okumam gerekecek.

Tekrar teşekkürler!!!!

dee

 
deeforex:
Tekrar teşekkürler!

3. satırı son satırdan buna değiştirdim

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

ve işe aldı. Yatma saatim çoktan geçti. Yarın uyandığımda kodunun mantığını inceleyeceğim. Ama inatçı olduğum için lanet olası ArrayMaximum işlevini nasıl kullanacağımı bulacağım!! Ayrıca eski yöntemlerimin ne kadar yanlış olduğunu görmek için indeksleme hakkında daha fazla okumam gerekecek.

Tekrar teşekkürler!!!!

dee

sadece size biraz zaman kazandırmak için max işlevinin istediğiniz şey için çalışmamasının nedeni, çok boyutlu bir dizi kullanmanız ve farklı türde verileri depolamanızdır. Bu verilerin maksimum değerini döndürür, bu nedenle GERÇEK maksimum lot boyutunuzdan daha yüksek bir kâr numarası veya herhangi bir şey döndürmeniz olasıdır.