1000101110001110010111000001110110110001100110001111001011111010110100111001110011000010010110101101011000011111111000010100011000000011101100001000101000110001100000110010100101011110011000000110010001011010101001010001001111111000010100101010101001000101000001111111011110010010101010100010101110001001101011100001111100000010010000101101111111010100000110111010001000101100001111111010110001010100 0110001000100111101110111100011010100011001000100011101000110000110001110001000010010001110011010011111111111011011111101000001011001010011110111010101010111011111011011100011010101100001101111101000010011110101000010011010100100100111100010111000101101001010000101011101100010000110101110000100110000100100011000001111000000000000101011000000100100011011011110101100010001101001000001011000100111100 1111101000111010010101010110010011110100010010111100000001101111111101010110110010010001111011101100001100100100100000101110010001001111111001111100101101100101001111001111000101111000010110000101000000111000011010001001010010010110001000000101000101100110111000011000011010001001010111000110000001110100111100111001011110111101110011111100010111001000000001011111111101101110000011101111010010000001 0010110001011111110111100111100111000100110100100011100010110001111110101001010001110010111011111110101010001111111001101100101010010001101000001011011000010000010010000110101000001100010011101110011010100110000101010100101000001110010010001001110001101110010111101010100011001000010000001100011001111010110010101011001000100000101001111111101011110011011110110111100101110001010000000110101101101101 0000110101000111001011001111011001100010010011001100110101100111111100110101111010000010111000111101001101001100111100110101010101111010100101100011101000101010101100001110010100101101010010101010011101101110101010110100011110000110011101111001001000100100001010001001010110010100000001000111000010111000011000100100101000000100100010001010010101101110111001111111010011011011000001110101010100000011 0101101001110000011011100100011001000111011011111000001101100111001111110101111101100100101100001110111111011101101101111101111110001000111111100101011001001100011101011111110110100110111010000000111010111111101101010011100011000011010000011111011101110101000101010100011100011101101110010000001010001101010111001110000010011100010011010101011010100011000010010101000100101110011100000111101010110100 0001100100110111010101101100110111101000100100010010001001111010001100001001011000110011101000110100011001100110111101111011011000111001011111001111001110011101100111001000100101110001010011010100011010100101001011100001010110111010011000011100111000001001000000000010110000100110011010001000010110100011101110001101001000100100101110111100101001110110001101011011011100110011111100100110101111001000 1100100110001101101011101000011110100101000011011011110100001110101001011010001100011011000001111010000101001101111001010110111111100110100010000010000010111000100001000001000101101001011100101110110010000010001111100001110111001110011110000010010000111100000001100111011000101001011100011110111111110010101000000101001001110010010111100011100000011011101110100000111011010000000001011010100011101000 1101111011101111110100001110001110000111011001111000101011110111001111001111011101100110000110110000101100110000100110001101111001100011100001111010101011110011101111000000110000100011111101001001001001100011010000100110001000010111011111000010100111111100111110011101010011011110001101110001110000000011000110011000111111011010000011010110100101011110111011001000101011010111010010011100001001010000 0101100100111100100011011110100011010101000000101111111011100101010011111011100100010110010100100001111010010100100001100101001110101011000001000000011010001000100001000101111011001101101100001101000111110110011101001111111001101010000110101100101001110011110010011100001110110101000100111110011100010000111101001101010111100100011000100111100000010010101101011010101110111111111011010110110101100010 0000000011001001000001110000111001010010011000001010011011101001110100110101101000101100000011010011101101110111110000101010011111000001101110011101001111100110001010000101111100110000111011011010101110001000111011011001111010000000010101011100101010111011100000001010100101111111000100000001011100011000100100011110100011111110010110010110001001101001100010110101100001110000001010011010101110101010 1001100000100010001011000111111100111111111000100000101001010001101100010111101110010011101100111100101000010001101101101100011010010110000110000101010100000111100111000011101101101100011001010110111111011111101000110101001010100001000110100001110010011000111101101000000100110010001010011111100011111111110100000010111011010011100100011011100001000100110110001001110001101111000000011001111110010111 1101010001101110111010011010101001010110000100010101101001110001011001011010101111110100010101101110100001101110000010101001001010101010011110001110001100001001100101100110000111011000101010010111101010011001011011101111100100101100101111101111111101111000110001100111101111100101010000000010111110100000110101001111001011111000110110000011000010100101101111101001010010011101000110000100010001001111 0001010001110001001111000101010000001110111010100110111010100010110111110101010100110111111011101100011010001000111111000100011111000001000111001010011101111001010101101110101011011000100110011011101011111101001000000101111111011010000001100010111011000010010001010010010101000110001000111100010110010001110001011110111011101011010010111110110101100110100000001000110011011011001010101001001001010010 1100101101111111001010100110110001100110010000111011111011010001110110010111101100101000110010101000001011000000000001011111001110011011100111111100000001000010100101010110100000101101010100010000000111110011000001101010010000111101000111100110010111011101111100101001101011111010110110110001001111101110100011110011000001111011010011011101010111111110001000000001101101010111101000000011111010101101 0010010001001001110101000100110000011100101000001000101110001101010011100110110011111110001110111001001011110100101000010110010110101100101000001110010110101010101101011110000110000001010011110000111100110000010000100001101110001100101111101000100100000001100011111010000010011010010010011001110000000011111101011110110001110011001111011111001010000101100110011010001001000101101010011110101000010100 1101110000001101100111001001010011010011010100110000010101111001010111100111000110001001010110001011000110011101001001111000111010110110000011010101011011111000111001100111011011000111110010100011001111011001100101010101000100011000110000110110110001011111010100001001000100101010110101110001010011111111011110010101110000111111001111111001011100000010001000101000111011110001011110001011001111000111 0011110010100111101111011101100010000110000011100010001100001111110100010111011101000110011010110010110110001010000000100010001010010110010000011001000010101110101111010101001010100010011010001110111011101110001000011011000100011111111110011011001010010001111010011110101110110100001110100111110011101001110101110111110101010011000000011101010010010001011011010110100000100011111101110000111110110110 0111110111010101011101101010111101010101111000101100001011010001010001111011010000101100010000111010111010100001011101010010101101110011011111101011110011001110101001010000110111101001100011110010000000100100100110010111010100010110111000101101010001100001011010100110010111011001011011011111111100110110100101110110101110110101010001101101011101100111010100100011101000011101110010011111101111101111 0101101010001111011001010000010110100101011001111101011000100110111101100110111111011110111000001011100101110111100110100101101011100001011000100111101111101010100111100101010100101110101110100101011010010011000110110110000100100110011010110110001010101101111111010111011100110011110100110101010110110001111111011010011111011100000111100101000100111101101011100011000010100011100010010011000001111010 0011010111110110010001001101110011101110010001100101000110010100001011010110110110101011100010111001101000000111001010111000100001111001010010010001111011101000010000011010000000010101010100000101010101000011011010010001111010011011110101001100010110000000111101111100010000110101110011100011001011100110111110001110000111000100010010001101100111110001101001001110010111001001011011100001011101110001 1001100000100011100101010010100000001110011000101101100110101001001010111011100111111010010101000101000000110111000000101000010100110000101101101001111110110110100011111111000010011001101101000111101101100011100101011001100101111010010011101110111011100000010110000100001100110101101100110011101010111100100001001011011001101111110101101011011000001101111000101111100111111111000111011001100111101101 1011100111000000110110000110100110001101101000001001011011011111111010111101110100110101010100100001101110110001000111001010110111010011110110110100110111011011001000101110001101110011001011101111010001000010110010110110100100101101000011101110000011100101000111101101001110000000010100111010100001010110000101010000010000101111001111011000101011100010011100011001000001011000010011101111010100101111 1011010110000000011110111101001010011110010110110110000011001010000001000111001111001010000000100110111001001110110001001110011101000111001100011010111101011011101110011001101000100010011101011010110100011110110010000000011011111001101100001110101101111110011010110010100111000101001011010011101010100110101011101100101001110011010000101100110011110001011001000010101001101101001111011011111011110000 1101010001101111000111101011010111011101110111011001101101111011000001010111111000100101010110011110111100010101010111111000011111110110001000101001100000010110010111101001110010101100111011101001111001110111001110110011111001010011010101100000011100110100111100101001000001010000101101111100111100111100000000101010110010110111011100111000110101101100001111100110001011010010110100000000000010011011 0011010111100001101110000000100011111000011110010000100110010100101001110010111010010100101011000111110010000011100101011100011001001111011011011100101100011010100110000101100110111011110111010111011000000110011111011000111001111011010110011010010110101100110011110110011010000100111100001001110111001001110000010001110010011001110010110111000001110000000010001110000101111100100001110101001010110000 0111101110010000100111101101001100110100111000101101000011010000100000011001000011001101010111101100111010100001001000010111111001101010111111010101011001001000011111111100000111011100001100111010101011000101110110010000010000000100001100001001100001000011001001100001100101101111000011000011111100010010110100101001000111010000011001101111011011000010001010010010111101001111001110000100100000010001 1001111110101001101000111111001100101100101111100001010001010001110000000100111000110100000001100110101001000101010001001110011101101000110010000001011100101011110001110100000100101011010101111110111000010100100110000011110011011101111111101010111101110111011010100010000100001010001100100010010011011001001001100001000010010000010010111000011110010010010111010000110011000100011101110010101011011100 0010011101101010001110111001010000110011000110111000010111101110101000101011111101100011000101110111010000101101001101010111001010100100011111010101101100110001011000000111100011010101001001010001011011100101011110111011111110001001011000110110010100110100111101011001011110010101101001110001101111110001011100110101000100111100010000110011001110011110111110101000100010111110000110111110011011110100 1111010010011100011010001101110101010011100101000010111011010010100101111000100100101010001011111111110110001010000101110100000011111100000101011011111101011111011001100000011110010001010001000100010010110001101011000111010111000100001100110110011101011011011111100100001001111110101101011011110001111011011011111010000100010100000001111001110110010001001000110011111111001101011111010101001100000111 0101100001010110001010000010001110110101100110000101111001110110110110111011100010100110011100100001100011010101011010010101100001001001001011100101011010010001010100101100001011010000010111110011010101111001000000101001100101101000011001011111000011101000000000101101000101111011110100011110000010011011110101100011111011101010111010110010110101100100101101000100110001111010110011100101101000111010 1010001001001110110001010100100100101111111001001100110100001110100101010100011111100100101111101010000010011001111000110000001000010010010111010000101111001011100101110010100011000100001100110001010110100100001110001001000101101101110011100110010001100010111011110100110111100010101010000001111000011111101011010100010100001101000110010111001111111011100101111100110110011100110000111111100101110101 0100000111011001000101110000110011101110010010111010111011110011010011011111101001011011110111100000010011010000000011101011111111101110010000100101111110001111110011000010010010001101010101001010100000100100000011001001101011010101010010000000100111101001010000001101100111000011011101011010011001011111011011111011110000001100100100101111000010000111111000010010001101111111100000100101010010111110 1110110100111010011110000000101011101000000111111001110001100011110001101100000111100011001101011110011011111111110011011111110111111001111001111011111000101111011111011111101001110111100011011000010101010001100001100011100011101110111100110010000010001111111110010010010111001100111011010011100100110001000110101010111110011001110001000101010000100111100010001011110000000101101111111110100001100010 0101011010111101111101111010000011011111101011110010110000111011011110001111101011011010010011101010011001100010001111000100000010111010000010110000000101111010100111100100011100001001101110111100110001100000101011111110111001011101001101110010110111100001010100100000101001100111110100001100111011110100010101010111011010100011001011001001111110100010000000100000100000000011000110111111101100100010 0001000101101111011010011111110000111010001000000011101010011101100101001101110100111000000111100100100100011011111110100000010001101011100111000000110100110001010111001011101100000100101101110111111000010001001111111100010111011110110110101100001000001010001001110011111001100110100010000000000110000101101110001100010100011100000101101101000011001110101101001111000110011110010101111001010010011110 0110101111000100101000011111000000010110100110011110101010000010110100111110000010100110010111110001010110010111101111110010000111100100110110000010101111110111011111110101011001010111000000001010000100010110001111010111100111111111001110001110001100101011000011001011000011100100000010010111110000110011001100000010101110111111011101100110100101111000010111110001110011101101001000000100000011010110 0111100101011010010110101000110000101011010110100000000101001001010000100100111111001100010001100100010010010111010011011000011011111100011001100100100000101001110011000011001011100000010110011000101110001110000000111001001101010000010110001011111011111000111101001011110010100010111100100000011111000110111101001110110001101100101000111111100111111110111101000101100010010100011110000010100010010001 1101111101000001101011101000101001100111011111011111011011111011010110100111000011010001000111100100001001001100101111111011011101101001100010001001110011100000010000110100001100011110011011111011000011000001111010000110010000111000101001100101111111101010011110011111111010110110000001101010101110111001100010110001010100110000010110001010110100101100010010000010001000011000000011111000111111100100 1010100001110110110011111000100010101110001101000110110111110101100110000101011001001100100000100111111010111101011011110001001110110011111010000000100110110001110001111010001101010101000011111010000010010011011001111111010110110101010010000011110010000011011100110100001001000001001101101011011001110101011011001101010110100010100100010010011011111001110010100101100100000101011001000011100101001110 1000000000000101000100110011100011101010001000000000110000110010001001001111011011000111001110101111010011111000111110110110101110101010011000011010111100100010000101000111001101111100010100100011110011010111101111111001101110010000101010110100100110010010000001011110011011001000111111001111010110010110000011110011000111000100001110111100100100111001110001110000010010010100001001011100000110110101 0011101000101000011110100101111101000110000111110000100110111011110111010000000011110110010001101101111011000110010011111011011010101010111111110000001100000010000010100001011100001011101010000101010101001001010010111110110011101110100011110110111100001111101010001000101111000010110101101100001000110010000101000010101101100100010110100101011111101111001100011111110011101111010001001111011011011000 1010010111001011111101100111110100100111100011000000100010010111100100000101110001101000000010001010011011100010110111100111100101101111100101001011111110000111110001100110010000100101110000101100101000110000010010010110110111011101101101011010000100000010100001111111001001110000001100001011001101001100101111010101110010011000110110100000000101001111000010111000101100100001100110101110001001100010 1100001001110001100011011001011101110010110100001111110111101010011110100101001101100010000000110100011101011100010010010100010111110111100001010010000000010100100101011001101101111011001100101000000011101010101101111101101010010001110000011111111101111010010010011001100001110001011001110110100110100001110101100000101000010000010011110000000001100111001010100111000010001000110100110101001011110011 1111101011100001001110010111101101010010011101110111000100110100001110000000111001101010011000101111011010110110000010110101001100001001111010000100111111100111000100100100011111111011100010000110001110011011110011101111000111101011010110111000000110011011101000001011101001110011111110011000001111100110000010011111010110110001011010101010110110010110101100110100100100011110010001011001011010101100 0101100101110010111110010011011100110010101000011110111011001001110101100001000010010111001100110110110001010010101111111001011001110100000101011100110101100100011100001100100110011010111011011101111111111101100010101000100100111000111001100001110100001010010001011011101010110101101110100101010100100101010010010100011011010100010111000000100000101110000100100110111111000000001010101101110110100001 1011010010101111110000110100010001101011010001101011010101111010000000000100101111111100011110100111110110011111000110101100011001101101000101110011110111000101100000101000111111111101100110001110100111001010100001111110101110011000100110000101110011100100011011000110101101010000010001011110111110001000011000110110000011011010100010001101011000101100000111100110000010001101111001000110010101111011 0111101011100100111001111011010101011100111110010000010110011111011000101100000010110010110000110110110111001110000100100100010111110111011100010011101011101111100111010100101010010001011111000011101000011101011101000110101000000110011001110101101011101010100111110110100000001111011101110001101101100100111111010101010011001011111001010111111110000000011000110110010100000101110010110100101001011010 0010011110000011010101110000011001100010010010000110110111001010000111111001010000001010000001110001111100001100011001011110000100100000001100011011111110001110010100100010100001001101010101101100100011110011100110000111001010001000110110011101101000011000100011110001000101110010010000000011001000110001001101111001101110010100001100110010011000010100010110101111001001101000110010101001111000100111 0001001100111100111010011110001101001101101000110010111010010011010110111001001000100101110001101110111110110011100000011101100011000001101011010100100100100110001111010101000111111000101110000010101111011000100100101000000011111000010101110111011110101111000110101101100000101010110011001010101100010100000010000010101000110111000001011010110100001111011111110010011000101110110111110101011100010001 0000000111100010100001011010011101101101010110001000001011010010111111010001101100100100011110000111001110011010101100010111010110010101110110001110010101100111011000100101000101100010100010001010000010011010001000100111001011000001011010001011110101001110110111011001011010100111110110001111110010101010000000101100101001100010110100111011001000111110110110100001001011100010000010101000100111101000 1010000000001001110011001001001110010110000111110010111110011111101100101011101110101011100011100011011000011001111001011010101000110000111101010101001110000010000110111100010010011101110000010111001110000100100101100000101110001101111101101010111110001000011010101001000010110011110111011111101010001110110000011001111101111101101000101110110100000101100111001110010001010110000011010011111101010010 1101101010110001101010011111010010111001101101010010011001100100111011011010111110010111110011110011011100010101000111001110010010001101011100110011000100001101100101111100011100111111011001000000111110101101101111101101011001111001100110101001101011000100001100001000110111011010001101010100101100101010110100100111110110000101100101101100010000011100110101011101000010010110101101000011010111100101 1111101110100011111000001100011000101101100100010111100100010111110001000100001111100010101001001001100111000110000110010100001101100011110100110101101111101101001110011000111000011000100011100000011111111111110101111011010010110010100101011100011000100001010000011000000110100111010000100000001101010101000110010000000110111000011100111011001010101000111011001110110100101100101001100010001010101010 0111100110000011111111000101010011000011010000010100011010100010001110011111011010011001100110100001110110110111011100111101001001111001100110101011000011111101000111010011010101001000010100010010011011010111110011000001111100000101100011111101000011100101010101111001101100111110000101110101100011011000000000101101110101010010100101110101000110000110011011100110011000000000111000000000111000110100 1001010011110010101000101101011100110011110101010011110000000011110010111011110110010111111111100001011111010010111100111111011001001101100100110001100011001011111101001111010011010111100101000100000101111001100110101100110111001100100100000100100111011101110101100110111010101010101011100000000100101001000110111111011010011000010110101011000110110001010100110001111100011001000010110001111110110001 0100111100100110101101111101010111010011111001001100001111011101000111111101111111110001100010000100001001000101011110010111100100010000110011000011011001010000110110010100001111101000010100101000101011111100011111110011010101110101011110100010001100000111010010100111010001101110010101101001110010110001101100110010101110101110010111100010111000101101101010010100010010001111010111011000001110110111 0000010000110111111001000111010010001100001111100001000101111011010100000100011011010100001100001111011010000100011001010010001100111100000010000010111110010000010001011011011111101011001100000101101101001100001001101111101010101101100111100001100001011010000100111101110010100100010110010001000101010101001010000000001111100000000001000000110100101010000110111001011001011010001011111001000000100011 0001011110110001101110001001011011011010010101000111101000000011011001010100011000101010110010010000001101011100110111001001110101101111111100000000100011110110011111011110011011101111011011101001101110010100110111101100010100000011100110101101001000000000100000011101111000011111001111111111100110001010100011001110010101001111001110000110011011010111101010001010011100101100010010101110011100111000 0100101000000100100110010001000110111000001100111111101101000100001011010100111001010001101001100110011001000010001000001010010110101010100100001110011100000010011000001011010011010000000000100010111111000100011110110000000111010111011101110101010010110000000010010101011000011100110000111000011100001110111011110011010100100000110010000011110001011011000111111101100011110101110101110001110010001000 0111101001011100101111011000100101110101100001000001100011010000000010100011100010010010110111010111010000000101000001000100111011001000001010010100100110000010101111000001101011011100000011011001001011101001111011001110010010100001100110000100101010011000100110111011111101001100101110010001001101110111111110110110101101111011010111010101001010001001001111110000101011110010010101000001011010010110 0110111100110001111111000010010111011001011110010011100010111000011010101111011011101000111100110001010011100110100100101101011000000100011111110101001101111110001101101001100001101110100110100011111101000111110111101101101111010010101110111010110000101101100001011000100101111001101011010101001000001101111100100010000000101101010101010000000010010101011101000011100001000100110001001011010010001001 1001111010100110000000101000110010001110110101011111010001110110110100010000111001010101000100111001010010010000011011110111111100000101000000001111110110100011100101100100101001010000001001011001100100000011101100111110100100000100110001001111101101111000011010111000010010111001000110101010111100000100111001010011000100000000011011111010101100100110010111111010001100001011111110011100000010110000 1011101001110101010101101101101110010000011011101110010001000101111100010010110001101010000111000000110010010001010000111100111101011001110000110100100010101111101000001010000101100111111101010100001001111110010010100000000110100110101011011000111100001101000000101001001000011111011011100100001110010101010110010111010011111000000101100010010010001110100000111101000000110111101011111100111101101110 1001100101000110101000001111111010010100110000001010110011110001110100110100100110101100111000101001001001010110110000000100111001111100001100000001110100111000100101011000100101001101010100010011101100101110001011010110011010011111011100001111101110010100011010000101101010111101111011000000101101110111110000100001100100010010001011110101000011000010011111110001101010011111111010100101110010111100 0101100011111011010010100000101010110011011100000000000000001011111100001111000101011000010000100100111111111101001011010001010011010110001110001010111001010010101000100011011010001011000010000010110111111010010000111010111101101000000111011100010111000101001101010110111101110110101111011110010100000100110000100100100000010101100001100100110101101001101011011100000001101001011011010110101111101000 0011001110010111001100111100110011111111001100110101101100011100011010001011001010010110110001001010100100110001001110111010111110001111101100010000111101100110000010000010100100100100000010001001010011010110100010001101100111111011111101100101001010110101011010001101111110001111001111011110000100110100010011100001111100000111100000001010010001011110101100011101000001001010001000001111011000011001 0100000000110111100100110001101011010100100101001011001100000010110100001001011100110100101111100000101101001111111101011101000001101001110001110011001111110010001100001110110001000100100110000010000011111111111100100000111011111010000001101111010011010010000101110101011110100011100111001110110100011101111010110101001001101001101110111111000000001111110101110011100110010000101110111001010011101001 0011001010110001011011010100101011001100110101011000011001011001110111011001110111101001110010101111010011000010101010101110111110101011111011100011000000010110010001101100010011000000000010000011010101010000110100001100100100110011001100100110011010000011101000000100010001011100000100100000111001010110000001110101000111010000011111010100111100000111101001100101101011001000100001000101111110100101 0000001011100111111111010011010011000101100011101011011111010000000100011101100001001010000101010001010011000001101000000110101011001011011111011100101101101001100100101001010011110101000011100011101101010111111000110100000110010001111110001101111111011000011111001001101100110011110010100000010010110110010100010101111111101001101100110010111100110001100100100110110010110001101100100100001110011101 0100000010110100100010101100011000000100110110110000001011111101111010110101100101001110111100011101111000001001000010000011001010111100000001000000010001010010100110101100110101101100111101001011001000111001000011010011110010010101111101110001001000011010001110110010100011110001110001100111110100011101101110110111010001110100111100110101110001000101011110011010001000101010100010001100100010011100 1000000111010110110000111011001000011000110100011111101000001111010110100101011010010101110101001111100111011101100010000111110110000111001100000101101000111000101110110010110100011001110111100010000111100111000111110111011111010011110010100101001110111001001110111111101110001110100010001000010010101001100001110011111001010101101111101001011000001100001011011010110111111100110010011111000101001111 0010011011101001110100100100000000010100010100111100111001110010010111011011101011110111010001010010100101111110110100001010110110001001000100000011111110000001011001100101101110110001110000100101100001110111010110010100100011011011011000011100100110100101110010001010010100111101101110101001100111111100110100010100000101101001010001001111000110000010111000010100000001010100100100010101001010001111 1100010111101100100001011101010010100100101111111100000101110001101111110011000011111000000101001101110011111001100001010100100001010001011011011010001101110111010011100000111111110100010000101000000011101101111111100000101001110011000001010010101111100010110001110111100101101001100010011111001111011000110001110000001000010000110010101110011101011101010110000001001000001011010101110100111111000110 0100110011010010110011001100100001001110100011011011000100110010101111010111011010001001011111100000010100101111000001100010100000000001011100001110100011110001001110100000111000110100011000010000100010010000111000101011111101110111011101011010010111010001100010111101000110000011010001101010001001001101001110000011100000011101000110000100111110110100001000100111100111011111110001110001110110010010 1001110111111001001011101001000101010000000011001101110001011100010101101010010001111010001110000001011000110001001101100101101000001110001100111100010011110100011110100101111011110000011101010011110010001010100010000001011001000010010101000100011001111001100011111110100100110010111111101110101000101111001110000000001011100101000001100011110100101010000101010000010100101110011111000110010111110001 1010101001001100111110011000101101111101101000010101001110111000010100001000011100010110000110011001110101100001111000001111111100100101100100001101010100000001001101010011100000011100100111111100100000101001101011011010111110001001000010101101011100001011111100111111000101011010011110100010100111010001101001001011011100110110000101110011101110000110100110011001010011100011000110110011000001111101 0101010011111000010110011011000000010000101111011011100010100010111101001000110111101101011100101001001100000110100001000111000111101000111001101111001110011100101100010010000101111001011110100011100011100101010000010000011111010011010001010110101110101100100001000111001110000011110000101000101100110000100111000011101001000101001010011010100011001111010111001000101100011110110110101111011111100110 1011011111101001101110010110000010000001101000110001100111011111010001101010001110100010101000110100001011111000111110011001111100101110100101111010011010001011111101011101001010011101111111010000101101000110001001011000100100010110111010111000111111100100101101111100111101111111001111001110110011001101100011101001011101101000101110100111111000110001110100101110000101110011101111000100110001011101 1100111011011111111110010110010001110011100000110101001111100101001010100000000100101001010110001000000010001001111110000110000001011111110110111111100110000001011110100001110010110111011010110011101010011000010110110101101110100010110010001000110000001001000000010010100011101000010001100100001110111101100101010011011101111001110000010000110011111111001111010101000100110111000101000001110100101000 1111000110101110010000100010001011101001111111011101010010011011100100100001010101100001000111101011000000110100101110011101111000011011011011001111001111000010110010111001100100000110010000011101101100011100111111111110010001011010101101110111101001100100110010000000011010011000011000010111001010010000110010001110010100101101001110101101111111101100110000101011111110001111110000010101100000110000 0011011110100000000001100011110110000010000011111001010100011111111011000011100011000111001100100011111111011110101010101110000000011100011100010001110110001011111110010010000101110001011010110100110000100000000010001011101101001000111011001101111110110101011110000001111010000000110010011101111100000001011001001110011001110011111101001100111101000011010001101000100110101001010100101010110000001101 0011011011010100101001010111010100110000011001001111010001101001101110000001000101010111110001010011101001110000110011100111110100101001110100110000011101110001000011011100100100111101101010011011111111011111110100011000010010000010010001010000011100011000010111111111110110111000000011100111001011011001101011011011011010011101001110111011010001110000011101110001101010101001100110110010111011011010 0101011010001111010110110000111011001101100010010100101011110100110001111111111000111100101101000100010001010110111101101010101111111001110000000011000011100000100111010100111101101101001101110110010110101100110101001011101110110111000110001101100010101111000000100100101100010000001101110011110000111000100110110110010010010000001110100010011110100001001110010001001110001010001000100110110010100010 0000001011011100011111000100001100111010011000011111000001010111110111011110010110111001010001001000000101010010010110010011000011000100001110111101011101101001100111100100111110110011110011101001101000001101011001000010010011010111111110001111010101001110000000011100001001010000111110100011000111001101000000001010100111111101010000011110110010011011101111001100000010001100001001110101000010001111 0011100011101000110100101000010110001110110100011100011011100000100110011000001110110001101111001001111001010110010101000010100100001011110110110000000000100101100110110101110000000101000100111100011011100111110000110011010110111110101110110101011001000111011011011101101011101011001100011111100100100111110100001101101111101111011010010000100000100011010001100010100000010110001001010101010001000011 0101100100110010000000011111010111111111011101101101110100010001011010001111000100100101010011011111000111110011001001111011000100000000100111011001101111000110010011011001001100101110100000110011111010001111110111001000010101100100001001000101101011011010001011101001010111111101101000010111011001001111110000010010000101110010111001010010100111101101111100001010111110000100001101011110010011111011 1010010101010000111110111101001001001000010111110100010101000011000001010111000001001010101111010001000110111000101000100111001010100010011110000000101111001100000101100000001100101000110000111010000011011101000000010110010001011101011100111111000110101110100101111100011000111110001111110001110010001010010001100110101110011011111000111000100001100100110111101100110100001110001111010011101100001100 1000101011110111010110001110101100110011110010010100001000111110010001011000011101001011100010011101000111011100001011001000001111111111011110001011011001101011110010111001111101101000001001000100101111001101101010111001100111000110001011011011010000110101000111101100100011100111110011111001110110111101110001100101010011011011101011111111101111100011101110111100000100011111011110110000110011010011 1001011101100111110001101110001101011010000101110110100011000100101001010001111110110100110110110001011010001011011111011100001000011001100101011001110111100101000111001011100010001101000011100111001001110110010001111000100010100110101011000100010110100000110011110110101111010011000000110110010000101001101011000010011100010100000100101101011011001000011011000101000101010111111111111010110011010101 1100011000000010010010101001110110111101000111011011110001110010001010101101010000000110101000100011100111110110110101010110110011111010111011000111100100101001101111110110010000110100011111101000110001000110111110001000001000100000111101111001101110110001111110000110110101111011101000110100011101110100010011101110000100100101110111000100100011000101111011110110100000000110001001010000001000000111 0010000001000100010011000100011001111001000101100100101110111010110100101000001000010111010110001111000101011110001001000011000000110001011000101110010000101110101011001100011111000101001110101101100111100110000001001001111111000100100110101101111000000001101011001001011011110000100111100100010111100111001000000010001110100000100110000101110001011000101000001011101010010011110100101001100011011001 0000111010001100101011101101001000101001010111011100011110110001001101110011100001110100110101111011011010101010101111101101001100110010000001111001010001111101000001011001010000101000001101100110010110001000101010000111110011011011101001111000010100111000001111000110011110111000001011110110000110011001100000000011101011011011000100001110101000100011101110010111101001010010000111010001100111111110 0011001000110000011001111110111001101010011101101000110101011100000000000001101000000010011000111000110111001011000001110010110000101111001111101010100111001100010000101011011110000101000001011111110111111010000010010110010001111001001111101100110010110101100001111100000001101111011110111111001001111101101110111110100010010001111110001010110100111011010011111101111111001010100000011110111101001010 0111010010111111001011001011011110111011000011010101011111001010000110001001010010100011010010110011111011101101011111101111110000001111100000110010100110110011110101100011100111011110000110100010000101010101111001010001011000011100100110000011100110111000011001111011001100110100111011011110000110001111100100111101100111000111001101001110101010111001110101001011101110011101100011001111001111010010 1100000111011100001100101000110011111001011011101100101111100110110000011111111001100001011001100000011011100100000100100010001000000101101100111101100011001010001100100010001100101000110101110011111001000100110101111001110101001001000111000011100100000110001000111100011010011110110110110101110001001111100010011110000011011101000000000100111110111001010000100100100100001100110000011111111000100110 1110111000111011101101011000000010010100111011001111111100100001010111100110011100100001100111110110000011110110100111000010110011101001110101000110000001010000111000100100001101100001011101101110101000011101010010010100100000100001000100101111010100011010001100000001100001010011101100100010000010001101000100101100001111100001001011000111110010001100010000100010010110011100100011001010000101101000 0001000000000011101001110010001001111110101100010100100001111110100111100000110110111101110110111001111010010101010001010110111111011101101010000111011000111101001110111011101110010000111101011101111001101100001011110101010101111011111110111000000010111000011000011000110111011001111100101011110111010110000110001101101010101110110010100111100001101001100110011011010001111010101100000110010011100110 0011100000011000001100101101110001000100010100001000100010111111110100101011100010101010100011111100111011010111011000001110110111111101101100010010001100010010100110111101111001111111101100010111001000011010010101100001111100100000110000000110101100100101011011100111001010100101111001000100110101100101000111001111010001011010011001011100010000100110000010000110110110100001100101010110100000000100 0100111010111101010110010000100100001100001010001101100011101000100010110010100010111111000011011100110011100001100100100011001000101110000101111111011100110101110110000101011001000110100111101001101001000111110011110010110101111110000000101110101100000001010110010010110111101000101101001011110101110010000110110010110000000100011100001110011111111111000101010111000110001010000111001110100001101110
cTrader Algo

【cAlgo】サインツールを作る【SampleCode】

5/1/2021

4年以上前の記事です。内容が古くなっている可能性があります。

サインツールを手軽に作りたい

サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター

もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。

今回はcTraderでこんなのを作ってみましょうというお話です。

 

単純なサインの出し方

例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。

SimpleMovingAverage _sma;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。

でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。

おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。

であれば、バー更新時だけ条件判定しましょうか。

SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
    Bars.Tick += _=> {
        if(_lastTime != Bars.LastBar.OpenTime) {
            OnBar();
            _lastTime = Bars.LastBar.OpenTime;
        }
    };
}
private void OnBar() {
    var index = Bars.Count - 2;
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)

とりあえずこれで更新時だけサイン判定ができるようになりました。

しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。

ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。

 

いろいろ考えると結構面倒

ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。

というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。

これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。

 

SignToolsTemplete

主な機能

・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。

・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)

アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。

・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)

 

ダウンロード

こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。

Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。

 

使い方

ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。

仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ

 

①判定用メソッドを作成

まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。

ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。

//-------------------------------------------------------------------
//  サイン判定メソッドはこんな感じで用意
//     必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {

    // --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
    if (index < 1) return null;
    if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
        return TradeType.Sell;
    } else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
        return TradeType.Buy;
    } else {
        return null;
    }
}

自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。

買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。

 

②Initialize内でオブジェクトを作成し、各種設定

Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。

以下はすべてInitializeメソッド内に記述します。

// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);

設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。

// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;

また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。

// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;

// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";

// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;

アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。

 

その他

サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。

また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)

 

SignIndicatorクラス詳細

細かい設定したい人用に。

プロパティ
(ChartIconType) BuyIcon { get; set; }

買いサインのアイコンを設定します。

(ChartIconType) SellIcon { get; set; }

売りサインのアイコンを設定します。

(Color) BuyColor { get; set; }

買いサインの色を設定します。

(Color) SellColor { get; set; }

売りサインの色を設定します。

(double) DrawMargin { get; set; }

サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。

(int) JumpMargin { get; set; }

◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。

(WhenAlert) WhenAlert { get; set; }

アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。

(string) SoundFile {get; set;}

アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します

(Color) AlertColor {get; set;}

アラート時にチャート色を変える場合の色を設定します。

(WrapPanel) ButtonPanel

ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。

 

メソッド

パブリックメソッドはありません。コンストラクタが一つあるのみです。

SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])

1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます

2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。

3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori