اجرای ناقص دستور foreach

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
متشکرم
من نمونه کدی رو که به تقلید از شما نوشتم میزارم ، این کد کار نمیده
یه همچین استفاده ای میخوام بکنم
کد:
            TimeFrame nh = null;

       
            _f1.comboBox1.SelectedIndexChanged += (d, l) =>
            {
                var tfst = (TimeFrame)_f1.comboBox1.SelectedItem;
                nh = tfst;
            };
            System.Windows.Forms.MessageBox.Show(nh.ToString());
میخوام از tfst خارج از متد SelectedIndexChanged استفاده کنم

سلام
استاد ، اگه اجازه هست ، ما هم جواب بدیم (تا جایی که بلدیم) :rose:

اگه منظورتون از کار نکردن اینه که رویداد SelectedIndexChanged ای که تعریف کردین اجرا نمیشه ، بخاطر اینه که از وقتی که اون کدتون اجرا شد (یعنی رویداد SelectedIndexChanged را که مقدار اون متد را بهش دادین) ، از اون به بعد ، هر وقت این رویداد SelectedIndexChanged اتفاق بیفته ، اون متدی که بهش داده بودین را اجرا میکنه .
اما در کدتون ، مجالی نیست که اون رویداد را اجرا کنه . بلافاصله بعد از مقدار دادن رویداد ، کد MessageBox.Show را اجرا میکنه .
بنابراین مشخص هست که زمان اجرای MessageBox.Show ، اون رویداد و بدنه اش هنوز اجرا نشده و بنابراین به nh ، مقداری تعلق نمیگیره و ست نمیشه .

البته پیش استاد ، درس پس میدم .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
استاد ، اگه اجازه هست ، ما هم جواب بدیم (تا جایی که بلدیم) :rose:

اگه منظورتون از کار نکردن اینه که رویداد SelectedIndexChanged ای که تعریف کردین اجرا نمیشه ، بخاطر اینه که از وقتی که اون کدتون اجرا شد (یعنی رویداد SelectedIndexChanged را که مقدار اون متد را بهش دادین) ، از اون به بعد ، هر وقت این رویداد SelectedIndexChanged اتفاق بیفته ، اون متدی که بهش داده بودین را اجرا میکنه .
اما در کدتون ، مجالی نیست که اون رویداد را اجرا کنه . بلافاصله بعد از مقدار دادن رویداد ، کد MessageBox.Show را اجرا میکنه .
بنابراین مشخص هست که زمان اجرای MessageBox.Show ، اون رویداد و بدنه اش هنوز اجرا نشده و بنابراین به nh ، مقداری تعلق نمیگیره و ست نمیشه .

البته پیش استاد ، درس پس میدم .
بله/ همینطوره. در یک سطر یک عبارت لامبدا رو به رخداد SelectedIndexChanged متصل می کنیم (با عملگر =+ اتصال صورت می گیره) و در سطر بعد مقدار nh رو نمایش می دهیم.
اون اتصال به رخداد منجر به وقوع خود رخداد نمیشه. کد داخل عبارت لامبدا و کد بیرون اش از نظر زمانی و مکانی مستقل هستند.
هنوز هیچ رخداد SelectedIndexChanged ای رخ نداده و عبارت لامبدا اجرا نشده که nh مقداری دریافت کنه.
 

MRHADI

Member
سلام
ممنون از دوستان عزیز بابت راهنماییشون
من MessageBox.Show رو فقط من باب مثال عرض کردم ، شاید من نتونستم منظورم رو برسونم یا اینکه هنوز نتونستم راهنمایی شما رو متوجه بشم
صحبت من اینه که وقتی در کد زیر که مثال هست اگ من بخوام مقادیر NUM رو در جای دیگری خارج از حلقه استفاده کنم چطور باید این کارو انجام بدم؟
مثلا اینجا میخوام NUM رو در timer1_Tick هم استفاده کنم ولی خطا میده چون NUM فقط در داخل حلقه ایجاد شده و همونجا هم قابل استفادس
یه سوال دیگه ، الان در این کد میخوام بگم اگر Text دو یا چندتا Button که ساخته شده یکی بود مثلا یه کاری انجام بده،مثلا دوتا باتن دارم که Text اونها مساوی هم هست و میخوام
رنگشون عوض بشه به عنوان مثال
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1,1, 2, 3, 4,4, 5 };
            foreach (var NUM in IN1 )
            {
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
           
           
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (NUM =......)
                //
                //
                //
        }
 

the_king

مدیرکل انجمن
سلام
ممنون از دوستان عزیز بابت راهنماییشون
من MessageBox.Show رو فقط من باب مثال عرض کردم ، شاید من نتونستم منظورم رو برسونم یا اینکه هنوز نتونستم راهنمایی شما رو متوجه بشم
صحبت من اینه که وقتی در کد زیر که مثال هست اگ من بخوام مقادیر NUM رو در جای دیگری خارج از حلقه استفاده کنم چطور باید این کارو انجام بدم؟
مثلا اینجا میخوام NUM رو در timer1_Tick هم استفاده کنم ولی خطا میده چون NUM فقط در داخل حلقه ایجاد شده و همونجا هم قابل استفادس
یه سوال دیگه ، الان در این کد میخوام بگم اگر Text دو یا چندتا Button که ساخته شده یکی بود مثلا یه کاری انجام بده،مثلا دوتا باتن دارم که Text اونها مساوی هم هست و میخوام
رنگشون عوض بشه به عنوان مثال
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1,1, 2, 3, 4,4, 5 };
            foreach (var NUM in IN1 )
            {
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
          
          
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (NUM =......)
                //
                //
                //
        }
اینکه flowLayoutPanel1 رو به Controls اضافه می کنید ایراد فنی نداره چون بیش از یکبار درج نمیشه اما احتمالا نیازی به اینکار نبوده.
وقتی هدف این باشه که مقداری رو به متدی مثل timer1_Tick ارسال کنید باید برای فراخوانی اون متد هم کاری انجام بدید.
اون NUM در واقع عناصر اون آرایه IN1 است، پس اگر بخواهید برای تک تک عناصری که در NUM قرار میگیره اون timer1_Tick اجرا بشه باید timer1_Tick رو فراخوانی کنید.
حالا یا می توانیم timer1_Tick رو برای تک تک اون عناصر یکبار اجرا کنیم، یا اصلا خود آرایه رو یکجا به timer1_Tick ارسال کنیم تا خود timer1_Tick تک تک عناصر رو پیمایش کنه.
برای ارسال مقدار NUM یا آرایه به timer1_Tick باید از مشخصه، متغیر، پارامتر یا متد ای استفاده بشه که timer_Tick بهش دسترسی داره.
یک راه حل اینه که با یک فیلد تعریف شده در کلاس ارسال صورت بگیره، یک راه حل اینه که از مشخصه بلااستفاده ای مثل Timer1.Tag استفاده بشه، یا حتی از پارامتر sender استفاده بشه.
راه حل اول : با پارامتر sender مقدار NUM رو ارسال می کنیم :
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                timer1_Tick(NUM, EventArgs.Empty);
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            var NUM = (int)sender;
        }

راه حل دوم : از مشخصه Tag استفاده می کنیم :
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                timer1.Tag = NUM;
                timer1_Tick(timer1, EventArgs.Empty);
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            var NUM = (int)timer1.Tag;
        }

راه حل سوم : یک فیلد در Form رو مخصوص اینکار تعریف می کنیم :
کد:
        private int _NUM;

        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                _NUM = NUM;
                timer1_Tick(timer1, EventArgs.Empty);
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            var NUM = _NUM;
        }

راه حل چهارم : اصلا خود آرایه رو منتقل می کنیم :
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
            timer1_Tick(IN1, EventArgs.Empty);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            var IN1 = (int[])sender;
            foreach (var NUM in IN1)
            {
            }
        }
و ده ها راه حل دیگه.
برای جستجوی مقادیر تکراری می توانید مجموعه اعضاء flowLayoutPanel1.Controls رو بررسی کنید. حالا یا موقع درج کردن دکمه جدید :
کد:
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                foreach (Control other in flowLayoutPanel1.Controls)
                {
                    if ((other is Button) && (other.Text == BTN.Text))
                    {
                        // ...
                        other.BackColor = Color.LimeGreen;
                        BTN.BackColor = Color.LimeGreen;
                        // ...
                    }
                }
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
یا بعدا با مقایسه تک تک اعضاء :
کد:
            var controls = flowLayoutPanel1.Controls;
            for (var i = 0; i < controls.Count - 1; i++)
            {
                if (controls[i] is Button == false)
                {
                    continue;
                }
                for (var j = i + 1; j < controls.Count; j++)
                {
                    if ((controls[j] is Button) && (controls[i].Text == controls[j].Text))
                    {
                        // ...
                        controls[i].BackColor = Color.LimeGreen;
                        controls[j].BackColor = Color.LimeGreen;
                        // ...
                    }
                }
            }
البته اینجور موارد راه حل های زیادی داره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون از دوستان عزیز بابت راهنماییشون
من MessageBox.Show رو فقط من باب مثال عرض کردم ، شاید من نتونستم منظورم رو برسونم یا اینکه هنوز نتونستم راهنمایی شما رو متوجه بشم
صحبت من اینه که وقتی در کد زیر که مثال هست اگ من بخوام مقادیر NUM رو در جای دیگری خارج از حلقه استفاده کنم چطور باید این کارو انجام بدم؟
مثلا اینجا میخوام NUM رو در timer1_Tick هم استفاده کنم ولی خطا میده چون NUM فقط در داخل حلقه ایجاد شده و همونجا هم قابل استفادس

سلام
خواهش میکنم (البته ما خودمون شاگرد استادیم) .
متغییر را در هر بلاکی که تعریف کنید ، فقط در همون بلاک قابل دسترس هست . منظور از بلاک ، همون علامت {} هست . مثلا در بلاکِ حلقه تعریف کنید ، همونطور که در کدتون میبینید ، فقط درون بلاک حلقه در دسترس هست . در بلاکِ تابع و متد تعریف کنید ، فقط در بلاک مربوط به همون متد در دسترس هست .

حالا اگه بخواین متغییری را که در بلاکی تعریف میکنید ، در خارج از اون بلاک در دسترس باشه ، باید خارج از اون بلاک ، یک متغییر تعریف کنید و داخل اون بلاک ، مقداردهی اش کنید . کلا اگه متغییری را میخواین در چند بلاک در دسترس باشه ، باید جایی اون را تعریف کنید که برای همه ی اون بلاک ها ، فضای مشترک محسوب بشه .
بنابراین چون در دو متد (متد Form1_Load و timer1_Tick) میخواین به متغییرتون دسترسی داشته باشین ، باید جایی اون متغییر را تعریف کنین که هر دوی این متدها بصورت مشترک بهش دسترسی داشته باشن و اونجا هم ، سطح کلاس هست . بنابراین باید متغییری را در سطح کلاس (همون متغییر سراسری) تعریف کنید و داخل اون بلاک حلقه ، مقداردهی اش کنید و در هر جای اون کلاس ، میتونید استفاده اش کنید (متغییربنام globalNum در کد زیر) :

کد:
        private int globalNum;

        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1, 1, 2, 3, 4, 4, 5 };
            foreach (var NUM in IN1)
            {
                var BTN = new Button();
                this.globalNum = NUM;
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }


        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (this.globalNum == 3)
            {
                MessageBox.Show(this.globalNum.ToString());
            }
        }

البته در کد بالا ، فقط قوانین سطح سطح دسترسی اش رعایت شده . اما عملا ، کد داخل شرط if (this.globalNum == 3) در متد timer1_Tick ، اجرا نمیشه .

چون نمیدونم هر تایمر ، در نخ مجزا ای اجرا میشن یا نه . بالاخره چه بشن یا نه ، ماهیت نخ ها ، عملکردشون جوری هست که اون کدی که گفتم را اجرا نمیکنن چون مقدار globalNum برابر 3 نخواهد شد یا اگه در نخ مجزایی اجرا بشن هم ، باز احتمالش تقریبا 0 هست که اون کد اجرا بشه (کلا اگه درباره ی اجرا شدن یا نشدن این کد اگه سئوالی دارین ، بذارین استاد جواب بدن) .


یه سوال دیگه ، الان در این کد میخوام بگم اگر Text دو یا چندتا Button که ساخته شده یکی بود مثلا یه کاری انجام بده،مثلا دوتا باتن دارم که Text اونها مساوی هم هست و میخوام
رنگشون عوض بشه به عنوان مثال
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            int[] IN1 = { 1,1, 2, 3, 4,4, 5 };
            foreach (var NUM in IN1 )
            {
                var BTN = new Button();
                BTN.Text = NUM.ToString();
                Controls.Add(flowLayoutPanel1);
                flowLayoutPanel1.Controls.Add(BTN);
            }
         
         
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (NUM =......)
                //
                //
                //
        }

اگه فیلد flowLayoutPanel1 تون در کدی که دادین ، یک پنل هست و قبلا مقداردهی شد و داخل این پنل میخواین بچرخین تا دکمه ها (یا هر کنترلی که توش هست) را پیدا کنین ، میتونین توسط پروپرتی Controls اش این کار را انجام بدین (یعنی توسط flowLayoutPanel1.Controls) . این پروپرتی Controls ، تمام کنترل های موجود در این پنل را در دسترس تون قرار میده . بنابراین از این پروپرتی میتونین در حلقه ها استفاده کنین . اما چون خروجی این پروپرتی ، همه ی انواع Control هستند اما شما فقط Button را میخواین ، داخل حلقه ، نوع داده ای اش را به button میتونین تبدیل کنین :

کد:
        Panel flowLayoutPanel1;

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control intoPanelControl in this.flowLayoutPanel1.Controls)
            {
                Button intoPanelButton = intoPanelControl as Button;

                if (intoPanelButton != null)
                    if (intoPanelButton.Text == "salam")
                        intoPanelButton.BackColor = Color.SkyBlue;
            }
        }

استاد جواب دادن که :)
 

MRHADI

Member
سلام
واقعا ممنونم ، توضیحات عالی و کامل هستند
چندتا مسئله دارم
1-اینکه میخوام وقتی فرم بسته میشه تنظیمات و انتخاب هایی که درش شده شده ذخیره بشه و دفعه بعدی که باز میشه با همون تغییرات باز بشه
2-سرعتش پایینه که قبلا هم عرض کردم و اگر لازم هست کدی رو که نوشتم براتون میفرستم
3-از timer هم استفاده کردم به روشی که فرمودید ولی بازم فرم رفرش نمیشه
سپاس
 

the_king

مدیرکل انجمن
سلام
واقعا ممنونم ، توضیحات عالی و کامل هستند
چندتا مسئله دارم
1-اینکه میخوام وقتی فرم بسته میشه تنظیمات و انتخاب هایی که درش شده شده ذخیره بشه و دفعه بعدی که باز میشه با همون تغییرات باز بشه
یک موضوع خیلی کلی است، تنظیمات یکجا و با چند سطر کد ذخیره نمیشه، باید برای تک تک انتخاب ها برنامه نویسی مناسب شون رو انجام بدهید.
یا باید برای برنامه پایگاه داده بسازید یا یک فایل برای ذخیره سازی تنظیمات بکار ببرید یا از Properties پروژه یا Registry ویندوز استفاده کنید. هر کدومشون مطالب مفصلی داره.
2-سرعتش پایینه که قبلا هم عرض کردم و اگر لازم هست کدی رو که نوشتم براتون میفرستم
هر چیزی که به نظرتون کند عمل میکنه و براتون مقدوره در پست های انجمن قرار بدهید، حتی اگه 20 سطر باشه، فایل شخصی از کسی دریافت نمی کنم.
3-از timer هم استفاده کردم به روشی که فرمودید ولی بازم فرم رفرش نمیشه
سپاس
تصوری از اینکه چی نوشتید ندارم.
 

MRHADI

Member
مورد اول خیلی برام مهمه و احتمال هم دادم که باید کار زیادی ببره
حالا یا زحمت بکشید در صورت امکان یک مورد رو مثال بزنید تا بتونم از روی اون بقیه موارد رو بنویسم،مثلا آیتم ComboBox یا منبعی معرفی بفرمایید جهت رجوع و مطالعه
مورد دوم هم بد نوشتم ظاهرا منظور از ارسال همینجا بود نه به صورت شخصی،چیز خاصی نیست و بیشتر جنبه تمرینی و آموزشی هست
،چشم پیوست میکنم
مورد سوم هم در سوالات قبلی ازتون پرسیدم میخوام فرم در هر n دقیقه رفرش بشه که در جواب فرمودید از timer استفاده کنم ولی دقیقا طبق فرمایش شما عمل کردم و رفرش نشد(در سوالات قبلی موجوده صفحه اول همین تاپیک)
خب الان که کل کد رو براتون میفرستم بهتر میتونید راهنمایی بفرمایید
کد:
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Windows.Forms;
using System.Threading;
using System.Linq;



namespace cAlgo
{

    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]

    public class SUCCES3 : Indicator
    {






        [Parameter("Symbols", DefaultValue = "XAUUSD,USDCHF,EURUSD,USDJPY,AUDUSD,NZDUSD,USDCAD,GBPUSD,GBPJPY,GBPAUD,GBPCAD,GBPCHF,GBPNZD,EURGBP,EURNZD,EURAUD,EURJPY,EURCHF,EURCAD,NZDCHF,NZDJPY,NZDCAD,AUDCAD,AUDCHF,AUDJPY,AUDNZD,CADCHF,CADJPY,CHFJPY")]
        public string SymbolsText { get; set; }





        public SimpleMovingAverage sma50TF2;



        public bool SCUTF2;
    


        public System.Drawing.Color CL;

        public string TT;
 

        private Form1 _f1;
        private Thread _thread;


        protected override void Initialize()
        {


            #region
            _f1 = new Form1();

            _f1.Shown += _f1_Shown;

            _thread = new Thread(() => _f1.ShowDialog());

            _thread.SetApartmentState(ApartmentState.STA);

            _thread.Start();

            #endregion


        }
        private void _f1_Shown(object sender, EventArgs e)
        {
            _f1.Text = "SETUP";
            DoSomething();

        }

        public void DoSomething()
        {

            _f1.comboBox1.Items.AddRange(new TimeFrame[]
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute


            });


            var TTT = _f1.comboBox1.Items.Cast<TimeFrame>().ToArray();

            var symbolNames = SymbolsText.Split(new[]
            {
                ','
            }).Select(s => s.Trim()).Where(s => string.IsNullOrWhiteSpace(s) == false).ToArray();


            foreach (var SN in symbolNames)
            {
                foreach (var TFFF in TTT)
                {
                    var PDH1 = MarketData.GetBars(TFFF, SN);
                    sma50TF2 = Indicators.SimpleMovingAverage(PDH1.ClosePrices, 50);


                    var buyrangeTF2 = (((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4) + PDH1.LowPrices.Last(1));
                    var sellrangeTF2 = (PDH1.HighPrices.Last(1) - ((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4));


                    {

                        if (PDH1.ClosePrices.Last(1) > sma50TF2.Result.Last(1) &&  ((PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(6) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(7)) || (PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(2) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Blue;

                        }

                        else if (PDH1.ClosePrices.Last(1) < sma50TF2.Result.Last(1)  && ((PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(6) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(7)) || (PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(2) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Red;

                        }
                        else
                        {
                            SCUTF2 = false;
                            CL = System.Drawing.Color.Empty;
                        }

                    }

                    {
                        if (TFFF == TimeFrame.Monthly)
                            TT = "M";
                        else if (TFFF == TimeFrame.Weekly)
                            TT = "W";
                        else if (TFFF == TimeFrame.Daily)
                            TT = "D";
                        else if (TFFF == TimeFrame.Hour12)
                            TT = "H12";
                        else if (TFFF == TimeFrame.Hour8)
                            TT = "H8";
                        else if (TFFF == TimeFrame.Hour6)
                            TT = "H6";
                        else if (TFFF == TimeFrame.Hour4)
                            TT = "H4";
                        else if (TFFF == TimeFrame.Hour3)
                            TT = "H3";
                        else if (TFFF == TimeFrame.Hour2)
                            TT = "H2";
                        else if (TFFF == TimeFrame.Hour)
                            TT = "H";
                        else if (TFFF == TimeFrame.Minute45)
                            TT = "M45";
                        else if (TFFF == TimeFrame.Minute30)
                            TT = "M30";
                        else if (TFFF == TimeFrame.Minute15)
                            TT = "M15";
                        else if (TFFF == TimeFrame.Minute10)
                            TT = "M10";
                        else if (TFFF == TimeFrame.Minute5)
                            TT = "M5";
                        else if (TFFF == TimeFrame.Minute)
                            TT = "M1";

                    }



                    if (SCUTF2 == true)
                    {

                      
                        var BTN1 = new System.Windows.Forms.Button
                        {
                            Text = SN + " " + TT.ToString(),
                            ForeColor = CL,
                            AutoSize = true,
                            AutoSizeMode = AutoSizeMode.GrowAndShrink,
                            FlatStyle=FlatStyle.Flat

                        };


                        _f1.comboBox1.SelectedIndexChanged += (d, l) =>
                        {
                            var tfst = (TimeFrame)_f1.comboBox1.SelectedItem;
                            if (TFFF == tfst)
                                BTN1.Visible = true;
                            else
                                BTN1.Visible = false;
                        };

                        {
                            if (SN == SymbolName && TFFF == TimeFrame)

                                BTN1.Enabled = false;
                            else
                                BTN1.Enabled = true;
                        }


                        BTN1.Click += (x, y) => { Chart.TryChangeTimeFrameAndSymbol(TFFF, SN); };

                        _f1.flowLayoutPanel1.Controls.Add(BTN1);

                        if (BTN1.Enabled == false)
                            BTN1.BackColor = System.Drawing.Color.LightGreen;

                    }
                }

            }
        }






        public override void Calculate(int index)
        {


        }

    }
}
 

MRHADI

Member
مورد ذخیره تنظیمات و رفرش شدن رو اجازه بدید با اطلاعاتی که دارم یکم کار کنم و اگر به مشکلی برخورد کردم مزاحم بشم ، فعلا ازش بگذرین،لقمه آماده دوست ندارم:)
ولی در مورد افزایش سرعت هیچ ایده ای ندارم و مطلبی هم نخوندم اگر ممکنه راهنمایی بفرمایید
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مورد اول خیلی برام مهمه و احتمال هم دادم که باید کار زیادی ببره
حالا یا زحمت بکشید در صورت امکان یک مورد رو مثال بزنید تا بتونم از روی اون بقیه موارد رو بنویسم،مثلا آیتم ComboBox یا منبعی معرفی بفرمایید جهت رجوع و مطالعه
مورد دوم هم بد نوشتم ظاهرا منظور از ارسال همینجا بود نه به صورت شخصی،چیز خاصی نیست و بیشتر جنبه تمرینی و آموزشی هست
،چشم پیوست میکنم
مورد سوم هم در سوالات قبلی ازتون پرسیدم میخوام فرم در هر n دقیقه رفرش بشه که در جواب فرمودید از timer استفاده کنم ولی دقیقا طبق فرمایش شما عمل کردم و رفرش نشد(در سوالات قبلی موجوده صفحه اول همین تاپیک)
خب الان که کل کد رو براتون میفرستم بهتر میتونید راهنمایی بفرمایید
کد:
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Windows.Forms;
using System.Threading;
using System.Linq;



namespace cAlgo
{

    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]

    public class SUCCES3 : Indicator
    {






        [Parameter("Symbols", DefaultValue = "XAUUSD,USDCHF,EURUSD,USDJPY,AUDUSD,NZDUSD,USDCAD,GBPUSD,GBPJPY,GBPAUD,GBPCAD,GBPCHF,GBPNZD,EURGBP,EURNZD,EURAUD,EURJPY,EURCHF,EURCAD,NZDCHF,NZDJPY,NZDCAD,AUDCAD,AUDCHF,AUDJPY,AUDNZD,CADCHF,CADJPY,CHFJPY")]
        public string SymbolsText { get; set; }





        public SimpleMovingAverage sma50TF2;



        public bool SCUTF2;
   


        public System.Drawing.Color CL;

        public string TT;


        private Form1 _f1;
        private Thread _thread;


        protected override void Initialize()
        {


            #region
            _f1 = new Form1();

            _f1.Shown += _f1_Shown;

            _thread = new Thread(() => _f1.ShowDialog());

            _thread.SetApartmentState(ApartmentState.STA);

            _thread.Start();

            #endregion


        }
        private void _f1_Shown(object sender, EventArgs e)
        {
            _f1.Text = "SETUP";
            DoSomething();

        }

        public void DoSomething()
        {

            _f1.comboBox1.Items.AddRange(new TimeFrame[]
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute


            });


            var TTT = _f1.comboBox1.Items.Cast<TimeFrame>().ToArray();

            var symbolNames = SymbolsText.Split(new[]
            {
                ','
            }).Select(s => s.Trim()).Where(s => string.IsNullOrWhiteSpace(s) == false).ToArray();


            foreach (var SN in symbolNames)
            {
                foreach (var TFFF in TTT)
                {
                    var PDH1 = MarketData.GetBars(TFFF, SN);
                    sma50TF2 = Indicators.SimpleMovingAverage(PDH1.ClosePrices, 50);


                    var buyrangeTF2 = (((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4) + PDH1.LowPrices.Last(1));
                    var sellrangeTF2 = (PDH1.HighPrices.Last(1) - ((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4));


                    {

                        if (PDH1.ClosePrices.Last(1) > sma50TF2.Result.Last(1) &&  ((PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(6) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(7)) || (PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(2) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Blue;

                        }

                        else if (PDH1.ClosePrices.Last(1) < sma50TF2.Result.Last(1)  && ((PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(6) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(7)) || (PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(2) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Red;

                        }
                        else
                        {
                            SCUTF2 = false;
                            CL = System.Drawing.Color.Empty;
                        }

                    }

                    {
                        if (TFFF == TimeFrame.Monthly)
                            TT = "M";
                        else if (TFFF == TimeFrame.Weekly)
                            TT = "W";
                        else if (TFFF == TimeFrame.Daily)
                            TT = "D";
                        else if (TFFF == TimeFrame.Hour12)
                            TT = "H12";
                        else if (TFFF == TimeFrame.Hour8)
                            TT = "H8";
                        else if (TFFF == TimeFrame.Hour6)
                            TT = "H6";
                        else if (TFFF == TimeFrame.Hour4)
                            TT = "H4";
                        else if (TFFF == TimeFrame.Hour3)
                            TT = "H3";
                        else if (TFFF == TimeFrame.Hour2)
                            TT = "H2";
                        else if (TFFF == TimeFrame.Hour)
                            TT = "H";
                        else if (TFFF == TimeFrame.Minute45)
                            TT = "M45";
                        else if (TFFF == TimeFrame.Minute30)
                            TT = "M30";
                        else if (TFFF == TimeFrame.Minute15)
                            TT = "M15";
                        else if (TFFF == TimeFrame.Minute10)
                            TT = "M10";
                        else if (TFFF == TimeFrame.Minute5)
                            TT = "M5";
                        else if (TFFF == TimeFrame.Minute)
                            TT = "M1";

                    }



                    if (SCUTF2 == true)
                    {

                     
                        var BTN1 = new System.Windows.Forms.Button
                        {
                            Text = SN + " " + TT.ToString(),
                            ForeColor = CL,
                            AutoSize = true,
                            AutoSizeMode = AutoSizeMode.GrowAndShrink,
                            FlatStyle=FlatStyle.Flat

                        };


                        _f1.comboBox1.SelectedIndexChanged += (d, l) =>
                        {
                            var tfst = (TimeFrame)_f1.comboBox1.SelectedItem;
                            if (TFFF == tfst)
                                BTN1.Visible = true;
                            else
                                BTN1.Visible = false;
                        };

                        {
                            if (SN == SymbolName && TFFF == TimeFrame)

                                BTN1.Enabled = false;
                            else
                                BTN1.Enabled = true;
                        }


                        BTN1.Click += (x, y) => { Chart.TryChangeTimeFrameAndSymbol(TFFF, SN); };

                        _f1.flowLayoutPanel1.Controls.Add(BTN1);

                        if (BTN1.Enabled == false)
                            BTN1.BackColor = System.Drawing.Color.LightGreen;

                    }
                }

            }
        }






        public override void Calculate(int index)
        {


        }

    }
}

سلام
یه مختصر جوابی به این پست میدم اما کاملش را استاد همیشه زحمت میکشن .

1) توی اون مواردی هم که استاد گفتن ، پیشنهاد شخصی من اینه که دیتابیس را انتخاب کنین چون بعدا به دردتون میخوره و همیشه باهاش در هر جایی سر و کار خواهید داشت .
برای دیتابیس هم با یه دونه مثال ، نمیتونین کل موضوع را یاد بگیرین . چون خیلی مباحث داره . خود دیتابیس هم به چند نوع دسته بندی میشه . اول باید برای خودتون انتخاب کنین که چه نوع دیتابیس را انتخاب میکنین . مثلا sqlite یا sql server و ... و بعد برین از سایت اصلی اش آموزش اش را پیگیری کنین یا توی سایت های فارسی هم میتونین آموزش گیر بیارین .

2) منظورتون را از افزایش سرعت ، متوجه نمیشم .
مثلا میخواین توسط پردازنده های چند هسته ای ، کاری کنین که هر هسته ، وظیفه ی رسمِ یک کنترل یا فرم را انجام بده؟ و به این طریق ، سرعت اجرای نرم افزارتون را بالا ببرین؟
کلا برنامه تون گفتین چند فرم داره؟
مدل دقیق پردازنده تون هم چیه؟ حجم رم تون چقدره؟ ssd هم دارین یا نه؟
کلا اطلاعات سخت افزارتون را میخوام بدونم .

3) در کدتون ، رویداد تایمری نمیبینم .
رویداد Timer.Tick نمیبینم .
بنابراین اصلا از تایمری استفاده نکردین .
 

the_king

مدیرکل انجمن
مواردی مثل PDH1.HighPrices.Last(2) ممکنه به روش های مختلفی تولید شده باشند، ممکنه کدشون طوری باشه که بخاطر محاسبه PDH1.HighPrices.Last(2) محاسبات پشت پرده زیادی انجام شده باشه که فرضا برای محاسبه PDH1.HighPrices.Last(1) همون محاسبات تکراری اجرا بشوند. اگر اینطوری است، بهتره که یکبار نتیجه PDH1.HighPrices رو در متغیری ذخیره کنید و به جای رجوع مجدد به PDH1.HighPrices از مقدار اون متغیر استفاده کنید تا برای Last(1) و Last(2) و ... محاسبات تکراری بیش از یکبار انجام نشه.
همچنین اون کد =+f1.comboBox1.SelectedIndexChanged_ برای هر کدوم از اون Button هایی که میسازید متد جدید متصل می کنه که کد خوبی نیست.
بهتره که فقط و فقط یک متد به SelectedIndexChanged متصل کنید که خارج از هر حلقه ای باشه و خودش همه Button ها رو بررسی کنه، برای هر Button ای یک متد مستقل نباشه.
اول برای Button اون TimeFrame مرتبط رو مشخص کنید که بعدا بشه تشخیص داد مربوط به کدوم TimeFrame ئه، با مشخصه Tag :
کد:
                            var BTN1 = new System.Windows.Forms.Button
                            {
                                Text = SN + " " + TT.ToString(),
                                ForeColor = CL,
                                AutoSize = true,
                                AutoSizeMode = AutoSizeMode.GrowAndShrink,
                                FlatStyle = FlatStyle.Flat,
                                Tag = TFFF
                            };
حالا در رخداد SelectedIndexChanged میشه بر اساس اون Tag برای وضعیت دکمه ها تصمیم گرفت :
کد:
                _f1.comboBox1.SelectedIndexChanged += (d, l) =>
                {
                    var tfst = (TimeFrame)_f1.comboBox1.SelectedItem;
                    var TTT = _f1.comboBox1.Items.Cast<TimeFrame>().ToArray();
                    foreach (Control c in _f1.flowLayoutPanel1.Controls)
                    {
                        if (c is Button)
                        {
                            var TFFF = (TimeFrame)c.Tag;
                            c.Visible = (TFFF == tfst);
                        }
                    }
                };
اثری از تایمر و متدی که باید در تایمر فراخوانی بشه نمی بینم. شما باید یک متدی داشته باشید که مقادیر رو در کنترل های مشخصی که وضعیت رو نشون می دهند قرار بده، حالا TextBox یا Label یا هر کنترل نمایشی دیگری.
بعد در تایمر اون متد رو فراخوانی کنید. اگر همچین کدی نداشته باشید من نمی دونم با تایمر چه چیزی باید نمایش مجدد داده بشه که به معنی رفرش باشه. اول مشخص باشه که کد نمایش چیه.
 

MRHADI

Member
سلام
یه مختصر جوابی به این پست میدم اما کاملش را استاد همیشه زحمت میکشن .

1) توی اون مواردی هم که استاد گفتن ، پیشنهاد شخصی من اینه که دیتابیس را انتخاب کنین چون بعدا به دردتون میخوره و همیشه باهاش در هر جایی سر و کار خواهید داشت .
برای دیتابیس هم با یه دونه مثال ، نمیتونین کل موضوع را یاد بگیرین . چون خیلی مباحث داره . خود دیتابیس هم به چند نوع دسته بندی میشه . اول باید برای خودتون انتخاب کنین که چه نوع دیتابیس را انتخاب میکنین . مثلا sqlite یا sql server و ... و بعد برین از سایت اصلی اش آموزش اش را پیگیری کنین یا توی سایت های فارسی هم میتونین آموزش گیر بیارین .

2) منظورتون را از افزایش سرعت ، متوجه نمیشم .
مثلا میخواین توسط پردازنده های چند هسته ای ، کاری کنین که هر هسته ، وظیفه ی رسمِ یک کنترل یا فرم را انجام بده؟ و به این طریق ، سرعت اجرای نرم افزارتون را بالا ببرین؟
کلا برنامه تون گفتین چند فرم داره؟
مدل دقیق پردازنده تون هم چیه؟ حجم رم تون چقدره؟ ssd هم دارین یا نه؟
کلا اطلاعات سخت افزارتون را میخوام بدونم .

3) در کدتون ، رویداد تایمری نمیبینم .
رویداد Timer.Tick نمیبینم .
بنابراین اصلا از تایمری استفاده نکردین .
خیلی خیلی ممنون از راهنماییتون
من 10 درصد #C رو با یه مطالعه اولیه مختصر و آشنایی کلی با دستورات یاد گرفتم و 90 درصدش رو با مثال ها و برنامه های نوشته شده راهنمایی ها
به همین خاطر خواهش کردم مثال بفرمایید و دیگه اینکه در مطالبی که گلچین کردم یه مختصری از طرز استفاده از setting بود که مراجعه میکنم و اگر حل نشد مزاحم میشم،تا جایی که میدونم دیتابیس سیستم رو بیشتر از setting درگیر میکنه و در این مورد همین setting راهگشاست، بازم خوشحال میشم از راهنماییتون

در مورد دوم وقتی فرم اجرا میشه یکم سرعت لود button ها کمه و یواش یواش روی فرم اضافه میشه و همونطور که مشاهده میفرمایید این فرم یک پنل و کامبوباکس بیشتر نداره و قصد دارم اضافش کنم که احتمالا کاهش سرعت بیشتری خواهم داشت،بنابراین میخوام سرعت اجرای کل فرم بیشتر بشه
سخت افزاری که فرمودید اینا هست :
cpu cori7 6800 HQ
ram 8 gig
ssd 128 &hdd 1TB

تایمر هم چون جواب نمیداد پاکش کردم ولی دقیقا طبق چیزی بود که استاد فرمودن در صفحه قبل همین تاپیک
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی خیلی ممنون از راهنماییتون
من 10 درصد #C رو با یه مطالعه اولیه مختصر و آشنایی کلی با دستورات یاد گرفتم و 90 درصدش رو با مثال ها و برنامه های نوشته شده راهنمایی ها
به همین خاطر خواهش کردم مثال بفرمایید و دیگه اینکه در مطالبی که گلچین کردم یه مختصری از طرز استفاده از setting بود که مراجعه میکنم و اگر حل نشد مزاحم میشم،تا جایی که میدونم دیتابیس سیستم رو بیشتر از setting درگیر میکنه و در این مورد همین setting راهگشاست، بازم خوشحال میشم از راهنماییتون

خواهش میشود .
به نظرم این شیوه ی یادگیری که صرفا با مثال ها بخواین چیزی را یاد بگیرین ، مناسب نیست . مگر اینکه بخواین اون مبحث را در حد اولیه و کار راه بنداز ، یاد بگیرین . البته من هم گاها در مواردی مثل شما هستم ولی در موارد ناچاری یا موارد خاص که معمولا منبع درست و حسابی ای وجود نداشته باشه یا در حد مبتدی بخوام یاد بگیرم و ... .
چون ، وقتی از مثال ها چیزی را بخواین استخراج و اثبات کنید برای خودتون ، اولا ، موارد زیادی از اون مبحث را بدون اینکه یاد بگیرین را میگذرونین چون درون یه مثال یا حتی ده ها مثال ، شاید نشه همه ی اون موارد را پیاده سازی کرد .
دوم اینکه مخصوصا زمانی که مباحث هاتون زیاد بشه ، چون در هر مبحثی ، از بنیان اش یاد نگرفتین ، هر بار اشکالات و موارد ناشناخته تون از مباحث ، زیادتر میشه . مخصوصا در مباحثی که یادگیری اش ، به مبحث قبلی مربوط بشه که معمولا توی برنامه نویسی ، این طوره .
حالا هر جور خودتون مایلید .

درباره ی لینک مثال هم ، استاد در پست بالا ، لینک دادن .

در مورد دوم وقتی فرم اجرا میشه یکم سرعت لود button ها کمه و یواش یواش روی فرم اضافه میشه و همونطور که مشاهده میفرمایید این فرم یک پنل و کامبوباکس بیشتر نداره و قصد دارم اضافش کنم که احتمالا کاهش سرعت بیشتری خواهم داشت،بنابراین میخوام سرعت اجرای کل فرم بیشتر بشه
سخت افزاری که فرمودید اینا هست :
cpu cori7 6800 HQ
ram 8 gig
ssd 128 &hdd 1TB

اگه منظورتون از یواش یواش ، اینه که با چشم ، به راحتی میتونین رصد کنین ، به قول استاد ، خیلی بعیده که مشکل از درج دکمه و کنترل ها باشه .
پردازنده هم بخاطر این سئوال پرسیدم که گفته بودم شاید مثلا پردازنده تون واسه 20 سال پیش و مثلا زیر 1.5ghz سرعت داشته باشه که پردازنده تون هم کاملا خوبه و فرکانس خوبی داره .
مشکلی اگه باشه ، یا از همون کدی که استاد گفت هست ، یا اگه در برنامه های و نرم افزارهای دیگه تون هم همین مشکل کندی هست ، ممکنه از ویندوز یا شاید هم از لحاظ سخت افزاری ، از دمای قطعات تون باشه (البته ، من پردازنده ای با عنوان i7 6800hq پیدا نکردم . احتمالا منظورتون i7 6700hq یا i7 6820hq هست) .

بالاخره اینکه همونطور که استاد قبلا گفتن ، نمیتونید برای کنترل ها ، نخ دیگه و جدیدی درست کنید و از اون نخ بخواین اون کنترل ها را ایجاد کنین یا داخل فرم تون بریزین . هر چند ، برای فرم ، میتونین از نخ جدیدی ، فرم ای را اجرا کنید اما نمیتونید از نخ دیگه ای بهش دسترسی داشته باشید .

کلا برای ساخت و رسمِ سریعترِ کنترل ها در ویندوز فرم ، راه دیگه ای نیست . شاید سرعت رسم کنترل ها در wpf بهتر باشه که اون را هم نمیدونم . چون wpf از رابط directx استفاده میکنه اون هم نه بصورت مستقیم . بنابراین ، شاید سرعت رسم کنترل ها در wpf از winform بهتر باشه . حالا اینکه سرعتش بهتر هست یا نه و اینکه اگه هست ، چقدر بیشتره را از استاد بپرسین . آمار رسمی ندارم .

اگه wpf هم نادیده بگیرین ، برای سرعت بیشتر ، آخرین راهکارتون اینه که کلا زبان دات نت را کنار بذارین و به سراغ زبان ++C بدون دات نت برین . که تفاوت چندان زیادی نداره . بین 1.5 تا 2.5 برابر (استاندارد ، 2 برابر) سریعتر از زبان سی شارپ هست که اون هم توی رسم کنترل ها ، فکر نکنم چندان تفاوتی کنه چون هر زبانی در ویندوز برای رسم گرافیکی و کنترل ها ، بصورت پایه و اشتراکی ، از api ویندوز استفاده میکنن .

اما اما کندی هم دارین ، کلا بخاطر سی شارپ و دات نت نیست . شاید همونطور که استاد گفتن ، از اون بخش از کدتون باشه .

تایمر هم چون جواب نمیداد پاکش کردم ولی دقیقا طبق چیزی بود که استاد فرمودن در صفحه قبل همین تاپیک

باید تایمر را توی این کد بذارین .
 

MRHADI

Member
سلام و سپاس
در مورد setting تقریبا کارم حل شد
در مورد رفرش از کد زیر استفاده کردم و الحمدلله جواب داد
کد:
Form1.ActiveForm.Refresh();
در مورد سرعت هم باید بگم همین کد در نرم افزار اصلی که فرم رو لود میکنه با سرعت خیلی خوب کار میکنه و کنترل ها رو روی صفحه اصلی میاره
ولی همین کد در فرم سرعتش پایینه و تقریبا حدود 3 الی 4 ثانیه طول میکشه تا کل کنترل ها لود بشن
بازم روی مطالبی که زحمت کشیدید کار و تمرین میکنم ممنون
لطفا راهنمایی بفرمایید اگر بخوام تا وقتی مثلا فرم f1 باز هست هیچ فرم f1 دیگه ای(همنام) باز نشه چطوری باید بنویسم؟هر چی نوشتم نشد
ممنون
یه مشکلی هم هست اینکه بعد دو سه بار باز و بسته شدن فرم کمبوباکس ها قفل میشن و دیگه کشوی اونها باز نمیشه
 
آخرین ویرایش:

the_king

مدیرکل انجمن
لطفا راهنمایی بفرمایید اگر بخوام تا وقتی مثلا فرم f1 باز هست هیچ فرم f1 دیگه ای(همنام) باز نشه چطوری باید بنویسم؟هر چی نوشتم نشد
فرم همنام رو خودتون باز می کنید. اگر بخواهید می توانید دیگه باز نکنید. طبق کدی که قبلا نوشته بودم در OpenForms جستجو می کنید و اگر همچین فرم ای پیدا شده یعنی قبلا باز شده.
کد:
            var forms = new List<Form>();
            foreach (Form f in Application.OpenForms)
            {
                if (f is Form1)
                {
                    // Found!
                    forms.Add(f);
                }
            }
            if (forms.Count > 0)
            {
                // Found!
            }
ممنون
یه مشکلی هم هست اینکه بعد دو سه بار باز و بسته شدن فرم کمبوباکس ها قفل میشن و دیگه کشوی اونها باز نمیشه
احتمالا قفل شدن به این دلیل ئه که منابع فرم آزاد نمیشن و همچنان فرم بسته شده داره پردازش هایی انجام میده. در کد thread = new Thread(() => _f1.ShowDialog())_ فرم رو میسازید ولی Dispose شدنی در کار نیست.
امتحان کنید و ببینید اگر بعد از ()f1.ShowDialog_ یک سطر کد ()f1.Dispose_ اضافه بشه مشکل رو برطرف میکنه یا نه.
کد:
            _thread = new Thread(() =>
            {
                _f1.ShowDialog();
                _f1.Dispose();
            });
 

MRHADI

Member
احتمالا قفل شدن به این دلیل ئه که منابع فرم آزاد نمیشن و همچنان فرم بسته شده داره پردازش هایی انجام میده. در کد thread = new Thread(() => _f1.ShowDialog())_ فرم رو میسازید ولی Dispose شدنی در کار نیست.
امتحان کنید و ببینید اگر بعد از ()f1.ShowDialog_ یک سطر کد ()f1.Dispose_ اضافه بشه مشکل رو برطرف میکنه یا نه.
سلام
ممنون
فرمایشتون انجام شد اما همچنان مشکل پا برجاست
 

MRHADI

Member
مورد اول خیلی برام مهمه و احتمال هم دادم که باید کار زیادی ببره
حالا یا زحمت بکشید در صورت امکان یک مورد رو مثال بزنید تا بتونم از روی اون بقیه موارد رو بنویسم،مثلا آیتم ComboBox یا منبعی معرفی بفرمایید جهت رجوع و مطالعه
مورد دوم هم بد نوشتم ظاهرا منظور از ارسال همینجا بود نه به صورت شخصی،چیز خاصی نیست و بیشتر جنبه تمرینی و آموزشی هست
،چشم پیوست میکنم
مورد سوم هم در سوالات قبلی ازتون پرسیدم میخوام فرم در هر n دقیقه رفرش بشه که در جواب فرمودید از timer استفاده کنم ولی دقیقا طبق فرمایش شما عمل کردم و رفرش نشد(در سوالات قبلی موجوده صفحه اول همین تاپیک)
خب الان که کل کد رو براتون میفرستم بهتر میتونید راهنمایی بفرمایید
کد:
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Windows.Forms;
using System.Threading;
using System.Linq;



namespace cAlgo
{

    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]

    public class SUCCES3 : Indicator
    {






        [Parameter("Symbols", DefaultValue = "XAUUSD,USDCHF,EURUSD,USDJPY,AUDUSD,NZDUSD,USDCAD,GBPUSD,GBPJPY,GBPAUD,GBPCAD,GBPCHF,GBPNZD,EURGBP,EURNZD,EURAUD,EURJPY,EURCHF,EURCAD,NZDCHF,NZDJPY,NZDCAD,AUDCAD,AUDCHF,AUDJPY,AUDNZD,CADCHF,CADJPY,CHFJPY")]
        public string SymbolsText { get; set; }





        public SimpleMovingAverage sma50TF2;



        public bool SCUTF2;
   


        public System.Drawing.Color CL;

        public string TT;


        private Form1 _f1;
        private Thread _thread;


        protected override void Initialize()
        {


            #region
            _f1 = new Form1();

            _f1.Shown += _f1_Shown;

            _thread = new Thread(() => _f1.ShowDialog());

            _thread.SetApartmentState(ApartmentState.STA);

            _thread.Start();

            #endregion


        }
        private void _f1_Shown(object sender, EventArgs e)
        {
            _f1.Text = "SETUP";
            DoSomething();

        }

        public void DoSomething()
        {

            _f1.comboBox1.Items.AddRange(new TimeFrame[]
            {
                TimeFrame.Monthly,
                TimeFrame.Weekly,
                TimeFrame.Daily,
                TimeFrame.Hour12,
                TimeFrame.Hour8,
                TimeFrame.Hour6,
                TimeFrame.Hour4,
                TimeFrame.Hour3,
                TimeFrame.Hour2,
                TimeFrame.Hour,
                TimeFrame.Minute45,
                TimeFrame.Minute30,
                TimeFrame.Minute15,
                TimeFrame.Minute10,
                TimeFrame.Minute5,
                TimeFrame.Minute


            });


            var TTT = _f1.comboBox1.Items.Cast<TimeFrame>().ToArray();

            var symbolNames = SymbolsText.Split(new[]
            {
                ','
            }).Select(s => s.Trim()).Where(s => string.IsNullOrWhiteSpace(s) == false).ToArray();


            foreach (var SN in symbolNames)
            {
                foreach (var TFFF in TTT)
                {
                    var PDH1 = MarketData.GetBars(TFFF, SN);
                    sma50TF2 = Indicators.SimpleMovingAverage(PDH1.ClosePrices, 50);


                    var buyrangeTF2 = (((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4) + PDH1.LowPrices.Last(1));
                    var sellrangeTF2 = (PDH1.HighPrices.Last(1) - ((3 * (PDH1.HighPrices.Last(1) - PDH1.LowPrices.Last(1))) / 4));


                    {

                        if (PDH1.ClosePrices.Last(1) > sma50TF2.Result.Last(1) &&  ((PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(6) && PDH1.LowPrices.Last(2) < PDH1.LowPrices.Last(7)) || (PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(2) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(3) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(4) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(5) && PDH1.LowPrices.Last(1) < PDH1.LowPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Blue;

                        }

                        else if (PDH1.ClosePrices.Last(1) < sma50TF2.Result.Last(1)  && ((PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(6) && PDH1.HighPrices.Last(2) > PDH1.HighPrices.Last(7)) || (PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(2) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(3) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(4) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(5) && PDH1.HighPrices.Last(1) > PDH1.HighPrices.Last(6))))
                        {
                            SCUTF2 = true;
                            CL = System.Drawing.Color.Red;

                        }
                        else
                        {
                            SCUTF2 = false;
                            CL = System.Drawing.Color.Empty;
                        }

                    }

                    {
                        if (TFFF == TimeFrame.Monthly)
                            TT = "M";
                        else if (TFFF == TimeFrame.Weekly)
                            TT = "W";
                        else if (TFFF == TimeFrame.Daily)
                            TT = "D";
                        else if (TFFF == TimeFrame.Hour12)
                            TT = "H12";
                        else if (TFFF == TimeFrame.Hour8)
                            TT = "H8";
                        else if (TFFF == TimeFrame.Hour6)
                            TT = "H6";
                        else if (TFFF == TimeFrame.Hour4)
                            TT = "H4";
                        else if (TFFF == TimeFrame.Hour3)
                            TT = "H3";
                        else if (TFFF == TimeFrame.Hour2)
                            TT = "H2";
                        else if (TFFF == TimeFrame.Hour)
                            TT = "H";
                        else if (TFFF == TimeFrame.Minute45)
                            TT = "M45";
                        else if (TFFF == TimeFrame.Minute30)
                            TT = "M30";
                        else if (TFFF == TimeFrame.Minute15)
                            TT = "M15";
                        else if (TFFF == TimeFrame.Minute10)
                            TT = "M10";
                        else if (TFFF == TimeFrame.Minute5)
                            TT = "M5";
                        else if (TFFF == TimeFrame.Minute)
                            TT = "M1";

                    }



                    if (SCUTF2 == true)
                    {

                     
                        var BTN1 = new System.Windows.Forms.Button
                        {
                            Text = SN + " " + TT.ToString(),
                            ForeColor = CL,
                            AutoSize = true,
                            AutoSizeMode = AutoSizeMode.GrowAndShrink,
                            FlatStyle=FlatStyle.Flat

                        };


                        _f1.comboBox1.SelectedIndexChanged += (d, l) =>
                        {
                            var tfst = (TimeFrame)_f1.comboBox1.SelectedItem;
                            if (TFFF == tfst)
                                BTN1.Visible = true;
                            else
                                BTN1.Visible = false;
                        };

                        {
                            if (SN == SymbolName && TFFF == TimeFrame)

                                BTN1.Enabled = false;
                            else
                                BTN1.Enabled = true;
                        }


                        BTN1.Click += (x, y) => { Chart.TryChangeTimeFrameAndSymbol(TFFF, SN); };

                        _f1.flowLayoutPanel1.Controls.Add(BTN1);

                        if (BTN1.Enabled == false)
                            BTN1.BackColor = System.Drawing.Color.LightGreen;

                    }
                }

            }
        }






        public override void Calculate(int index)
        {


        }

    }
}
ببخشید یه سوال دیگه
الان من 4 تا flowLayoutPanel ساختم و میخوام همشون همین کلیدهای BTN1 رو داشته باشن مثل همون flowLayoutPanel1
برای هر 4 تا باید بیام و کدهای مربوط به ساخت باتن و مشخصاتشون رو کپی کنم؟؟!!
من اینطوری امتحان کردم ولی نشد
_f1.flowLayoutPanel2.Controls.Add(BTN1);
_f1.flowLayoutPanel3.Controls.Add(BTN1);
_f1.flowLayoutPanel4.Controls.Add(BTN1);
ولی کلیدها فقط در flowLayoutPanel4 ساخته میشن
 

MRHADI

Member
فرم همنام رو خودتون باز می کنید. اگر بخواهید می توانید دیگه باز نکنید. طبق کدی که قبلا نوشته بودم در OpenForms جستجو می کنید و اگر همچین فرم ای پیدا شده یعنی قبلا باز شده.
این رو هم یادم رفت عرض کنم
فرم همنام رو من باز نمیکنم خود نرم افزاری که داره از فرم استفاده میکنه باز میکنه
باید کد رو طوری بنویسم که نتونه باز کنه و بجای اون همین فرم حاضر رفرش بشه
 

the_king

مدیرکل انجمن
ببخشید یه سوال دیگه
الان من 4 تا flowLayoutPanel ساختم و میخوام همشون همین کلیدهای BTN1 رو داشته باشن مثل همون flowLayoutPanel1
برای هر 4 تا باید بیام و کدهای مربوط به ساخت باتن و مشخصاتشون رو کپی کنم؟؟!!
من اینطوری امتحان کردم ولی نشد
_f1.flowLayoutPanel2.Controls.Add(BTN1);
_f1.flowLayoutPanel3.Controls.Add(BTN1);
_f1.flowLayoutPanel4.Controls.Add(BTN1);
ولی کلیدها فقط در flowLayoutPanel4 ساخته میشن
هر شیء Control فقط و فقط یک Parent قبول می کنه. یعنی یک شیء میتونه در یک زمان واحد فقط یک والد داشته باشه، نمیشه که یک شیء همزمان هم فرزند flowLayoutPanel2 باشه و هم flowLayoutPanel3
با کد بالا شما در سطر های متوالی اول میگید BTN1 فرزند flowLayoutPanel2 باشه ولی در سطر بعدی نظرتون عوض میشه و فرزند flowLayoutPanel3 اش می کنید و در سطر بعدی فرزند flowLayoutPanel4

این رو هم یادم رفت عرض کنم
فرم همنام رو من باز نمیکنم خود نرم افزاری که داره از فرم استفاده میکنه باز میکنه
باید کد رو طوری بنویسم که نتونه باز کنه و بجای اون همین فرم حاضر رفرش بشه
شما کد برنامه خودتون رو می نویسید، کارکرد برنامه ای که کدش رو شما نمی نویسید رو نمیشه اینطوری تغییر داد.
 

جدیدترین ارسال ها

بالا